例外処理をクラスで行うことも可能。
#include <iostream> class value_can_not_zero { }; class value_can_not_be_minus{ }; double calculate_km_per_liter (int km, int liter){ if (km == 0) { throw value_can_not_zero(); } if (km < 0 || liter < 0){ throw value_can_not_be_minus(); } return static_cast<double>(km)/(liter); } int main(){ int km {}; int liter {}; double km_per_liter {}; std::cout << "Enter km you want to run : "; std::cin >> km; std::cout << "Enter liter you bought : "; std::cin >> liter; try{ km_per_liter = calculate_km_per_liter(km, liter); std::cout << "Result : " << km_per_liter << std::endl; } catch(const value_can_not_zero &ex){ std::cerr << "Tried to devide by zero" << std::endl; } catch(const value_can_not_be_minus &ex){ std::cerr << "Negative value error" << std::endl; } std::cout << "Bye" << std::endl; return 0; }
cpp $ ./a.out Enter km you want to run : 100 Enter liter you bought : 1 Result : 100 Bye cpp $ ./a.out Enter km you want to run : 100 Enter liter you bought : 0 Result : inf Bye cpp $ ./a.out Enter km you want to run : 0 Enter liter you bought : 0 Tried to devide by zero Bye cpp $ ./a.out Enter km you want to run : -1 Enter liter you bought : -1 Negative value error Bye
コンストラクタに例外処理させることも可能
たとえば、
sample::sample(int number) :number(number){ if (number < 0) throw illegal_number_exception(); }
しかし、デストラクタに例外処理は絶対にしてはいけません。
std::exceptionを継承する場合
class illegal_number_exception: public std::exception{ public: illegal_number_exception() noexist = default; ~illegal_number_exception() = default; virtual const char* what() const noexcept { return "illegal number"; } }; int main(){ try{ sample a = new sample(); a.sample(-1); } catch (const illegal_number_exception &ex){ std::cerr << ex.what() << std::endl; } }