2014-12-03 2 views
0

Я долгое время работал с обработкой исключений. Я понял, чтобы заставить его работать, если он работает в функции void, но как мне обрабатывать функции, которые должны возвращать значение. Последние 3 строки в главном разделе, где происходит «проблема». Я нашел эту ссылку раньше, чтобы помочь мне зайти так далеко, но моя обработка исключений должна содержаться внутри структуры класса, поэтому я не могу попробовать/бросить/улавливать в основном. Я хотел бы понять, что происходит. [1]: What type of exception should I throw?C++ Класс, содержащий обработку исключений

Заранее спасибо.

#include <iostream> 
#include <exception> 

class out_of_range : public std::exception 
{ 
private: 
    std::string msg; 

public: 
    out_of_range(const std::string msg) : msg(msg){}; 
    ~out_of_range(){}; 

    virtual const char * what() 
    { 
     return msg.c_str(); 
    } 
}; 
class divide 
{ 
private: 
    int a; 
    int * _ptr; 
public: 
    divide(int r): a(r), _ptr(new int[a]) {}; 
    ~divide(){ delete[] _ptr; }; 

    int get(int index) const 
    { 
     try 
     {  
      if (index < 0 || index >= a) 
       throw out_of_range("Err");    
      else 
       return _ptr[index]; 
     } 
     catch (out_of_range & msg) 
     { 
      std::cout << msg.what() << std::endl; 
     } 
    } 
    int &get(int index) 
    { 
     try 
     { 
      if (index < 0 || index >= a) 
       throw out_of_range("Err"); 
      else 
       return _ptr[index]; 
     } 
     catch (out_of_range & msg) 
     { 
      std::cout << msg.what() << std::endl; 
     } 
    } 
}; 

int main() 
{ 
    divide test(6); 
    for (int i(0); i < 6; ++i) 
    { 
     test.get(i) = i * 3; 
     std::cout << test.get(i) << std::endl; 
    } 
    std::cout << "test.get(10): " << test.get(10) << std::endl; 
    test.get(3) = test.get(10); 
    std::cout << "test.get(3): " << test.get(3) << std::endl; 

    return 0; 
} 

ответ

2

Если вы ловите исключение в методе divide::get, он должен как-то сообщить своему вызывающему, что-то пошло не так. Поэтому реализация может выглядеть примерно так:

class divide 
{ 
//.. 
    bool get(int nIndex, int* nResult); 
//... 
int main() 
//... 
    int nRes = 0; 
    if(!test.get(10, &nRes)) 
     cout << "Something is not right"; 

Если есть много вещей, которые могли бы пойти неправильно, вы можете вернуть код ошибки вместо bool. Но если вы используете этот метод, в вашем классе исключений нет необходимости, вы можете просто вернуть ошибку, не создавая вообще никакого исключения.

Смежные вопросы