Я одобряю вышеуказанный метод,
но г ++ , кажется, жалуется, если
конструктор по умолчанию отсутствует.
Следующее дополнение заставляет вещи работать:
using namespace std;
class MyException : public runtime_error {
public:
/* add the following line: */
MyException() : runtime_error("MyException") { } // default constructor
MyException( string const& error ) : runtime_error(error) { } // ctor w/string
};
Кроме того, легко создается список исключений:
MyException FileNotFound ( "File Not Found" );
MyException ReadOnly ( "ReadOnly" );
MyException Unkown ( "Unknown" );
...
throw FileNotFound;
...
при обнаружении этих исключений, если вам не нужна специфичность, отлавливайте их в общем:
catch( runtime_error re) { cout << "Runtime Error: " << re.what() << endl; ... }
Так как все MyExceptions происходят от runtime_error, это ловит их всех и
вы не пропустите ни одной ошибки системы во время выполнения.
catch( exception e) { cout << "exception: " << e.what() << endl; ... }
ловит их всех.
В C ++ вы также можете генерировать и перехватывать любые типы (int, booleans, указатели и т. Д.). Иногда это проще
просто бросить / поймать строку или int в функциональном блоке.
Несколько классов должны только генерировать и перехватывать стандартные исключения библиотеки кода и их подклассы (и все одинаковым образом), однако, в основном для согласованности и обслуживания, а также потому, что компиляторы c ++ знают, как оптимизировать механизмы исключений и связи для их, и может генерировать интеллектуальные предупреждения и ошибки о них, облегчая отладку.
"Ошибка:" 0x137F "для парней из IBM, а не" третий парень в проекте в этом году"...