Разница между обработкой исключений в C ++ и Java?

В 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 ++? Я что-то неправильно понимаю?

23
задан ItamarG3 3 August 2017 в 11:26
поделиться

1 ответ

Точкой исключения на любом языке является или должна быть обработка исключительных случаев. Но все же есть случаи, когда вы можете делать разумные предположения о состоянии глобальной программы и, возможно, восстанавливаться. Ошибки программирования обычно означают, что вы не можете делать предположений о глобальном состоянии программы и должны завершать код как можно быстрее, выполняя наименьший дополнительный код (поскольку вы не знаете, что он будет делать).

В Java практически все сообщается с помощью исключения. Все от обычных ожидаемых ошибок («файл не найден» при попытке открыть файл) до критических внутренних ошибок (java.lang.VirtualMachineError). C ++ дает вам выбор: если вы обнаружите ошибку кодирования (ошибка подтверждения), вы можете немедленно прервать процесс (как правило, более подходящий, чем остановка в неизвестном состоянии); если «ошибка» - это то, что обычно происходит в повседневной работе («файл не найден»), вы можете проверить состояние или использовать код возврата (опять же, обычно более подходящий, чем исключение). Для ряда ситуаций между ними (например, нехватка памяти) C ++ использует исключения.

То, что является наиболее подходящим в данном приложении, конечно, различается: в некоторых случаях «файл не найден» является исключительным (например, если файл является частью приложения, которое не может работать без него), и гарантирует исключение. Аналогичным образом, в определенных случаях нулевой указатель может использоваться для управления логикой программы (if ( ptr == NULL ) ...) или соответствовать исключительному случаю (if ( ptr == NULL ) throw ...); в других случаях нулевой указатель является ошибкой программирования (assert( ptr != NULL)).

1
ответ дан 29 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: