C++での例外処理をテストしてみた。
#include <iostream>
#include <stdexcept>
class NotAllowedException : public std::runtime_error
{
public:
NotAllowedException(std::string const& error)
: std::runtime_error(error){}
};
class Kid{
public:
Kid():homeWorkDone(false){}
bool homeWorkDone;
void playVideoGame(){
try{
if(!homeWorkDone) throw NotAllowedException("Do homework first");
}
catch (const NotAllowedException &e){
std::cout << e.what() << std::endl;
}
}
};
int main(){
Kid kid;
kid.playVideoGame();
return 0;
}
std::runtime_errorをサブクラス化したクラスを作り、宿題をしないでゲームしようとすると、例外が投げられるようにしてみた。
当然これはmainの方にtryとcatchを書くこともできる。
class NotAllowedException : public std::runtime_error
{
public:
NotAllowedException(std::string const& error)
: std::runtime_error(error){}
};
class Kid{
public:
Kid():homeWorkDone(false){}
bool homeWorkDone;
void playVideoGame(){
if(!homeWorkDone) throw NotAllowedException("Do homework first");
}
};
int main(){
Kid kid;
try{
kid.playVideoGame();
}
catch (const NotAllowedException &e){
std::cout << e.what() << std::endl;
}
return 0;
}
こうする事によって例外を発生する可能性のあるKidクラスのメンバ関数を使った時に、クラスを使う人に例外発生時の対処を委ねる事ができるが、まったくtry catchを書かなくてもコンパイルが通ってしまうという問題がある。try-catchなしで、例外を発生させられたら、uncaught exceptionでプログラムが止まる。
でも、このやり方だと書くの忘れそう。Swiftのように、例外処理が起こりえるところで、try-catchをかかないとコンパイルが通らないとかいうふうにできないのだろうか。