В Java, если определенная строка кода вызывает сбой программы, то исключение перехватывается, и программа продолжает выполнение.
Однако в C ++, если у меня есть фрагмент кода, который вызывает сбой программы, например:
try
{
int x = 6;
int *p = NULL;
p = reinterpret_cast<int*>(x);
*p = 10; // the program crashed here
cout << "x = " << *p << endl;
}
catch(const char* Message)
{
cout << "There is an run-time error";
}
Тогда программа все равно аварийно завершает работу, и исключение не обнаруживается.
Так в чем же смысл обработки исключений в C ++? Я что-то неправильно понимаю?
Точкой исключения на любом языке является или должна быть обработка исключительных случаев. Но все же есть случаи, когда вы можете делать разумные предположения о состоянии глобальной программы и, возможно, восстанавливаться. Ошибки программирования обычно означают, что вы не можете делать предположений о глобальном состоянии программы и должны завершать код как можно быстрее, выполняя наименьший дополнительный код (поскольку вы не знаете, что он будет делать).
В Java практически все сообщается с помощью исключения. Все от обычных ожидаемых ошибок («файл не найден» при попытке открыть файл) до критических внутренних ошибок (java.lang.VirtualMachineError). C ++ дает вам выбор: если вы обнаружите ошибку кодирования (ошибка подтверждения), вы можете немедленно прервать процесс (как правило, более подходящий, чем остановка в неизвестном состоянии); если «ошибка» - это то, что обычно происходит в повседневной работе («файл не найден»), вы можете проверить состояние или использовать код возврата (опять же, обычно более подходящий, чем исключение). Для ряда ситуаций между ними (например, нехватка памяти) C ++ использует исключения.
То, что является наиболее подходящим в данном приложении, конечно, различается: в некоторых случаях «файл не найден» является исключительным (например, если файл является частью приложения, которое не может работать без него), и гарантирует исключение. Аналогичным образом, в определенных случаях нулевой указатель может использоваться для управления логикой программы (if ( ptr == NULL ) ...
) или соответствовать исключительному случаю (if ( ptr == NULL ) throw ...
); в других случаях нулевой указатель является ошибкой программирования (assert( ptr != NULL)
).