2015-02-09 2 views
1

Каков обычный способ создания & исключений дескрипторов в C++?Сколько классов для исключений

class CannotRead : public runtime_exception { ... } 
class CannotParse : public runtime_exception { ... } 

... 
throw CannotRead(); 
... 

или

... 
throw runtime_error("cannot read"); 
... 

Что идиоматических способ сделать это в C++?

Было бы полезно использовать ссылки на статьи, сравнивающие оба подхода.

Благодаря

+2

Использование явных классов исключений означает, что вы можете иметь более явную обработку ошибок. Если все, что вы получаете, это общий «runtime_error», вы действительно не можете обрабатывать определенные исключения таким образом, чтобы это лучше было лучше. –

+0

Просто используйте 'std :: runtime_exception' и дайте ему соответствующее сообщение об ошибке. Я бы не стал создавать лишнее исключение для каждого случая. –

+0

Я рекомендую: Нет, кроме стандартных исключений - Другими словами, как можно меньше. (также выводятся из std :: exception) –

ответ

4

Там нет вырезать и сухой совет не давать, но мое личное эмпирическое правило:

  • бросок std::runtime_error (или один из его братьев и сестер, в зависимости от обстоятельств)
  • , пока вы не найдете что вам нужно различать в catch -time между вашими различными исключениями, затем начать углублять наследственную иерархию.
1

Как правило, как и другие упомянутые в комментариях, вы черпаете из std::runtime_error и перегрузить виртуальный метод what(). В качестве упражнения для читателя конструктор также может быть записан для захвата сообщения об исключении. This сайт предоставил следующий код (хотя я немного изменил его, чтобы отразить изменение std::runtime_error).

#include <iostream> 
#include <exception> 

class MyException : public std::runtime_error 
{  
    const char * what() const throw() { 
     return "C++ Exception"; 
    } 
}; 

int main() 
{ 
    try { 
     throw MyException(); 
    } catch(MyException& e) { 
     std::cout << "MyException caught" << std::endl; 
     std::cout << e.what() << std::endl; 
    } catch(std::exception& e) { 
    } 

    return 0; 
} 
+0

Лучше вывести 'runtime_error' (или одного из его братьев и сестер), чем' exception'. –

+0

Да, хорошее шоу. Я отредактировал свой ответ, чтобы отразить ваш комментарий. –

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