' P '

whatever I will forget

C++ 例外処理 クラス

例外処理をクラスで行うことも可能。

#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;
  }
}