Исключения VCL в C++ Builder 5
Я пытаюсь контролировать исключения, возникающие в коде, однако этот пример не работает, как это должно быть в C++ Builder 5.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
throw Exception("NoNumber");
}
catch(Exception& E)
{
// but we never get the LALAL message
ShowMessage("LALAL");
}
}
Почему блок catch никогда не достигается при возникновении исключения?
1 ответ
Во-первых, вы должны ловить исключения по const
ссылка вместо:
catch(const Exception& E)
Это позволяет компилятору генерировать немного более эффективный код для управления исключением. Однако одно это не помешало бы исключению быть пойманным.
Если вы запускаете приложение внутри отладчика, имейте в виду, что отладчик сначала поймает исключение, поэтому вы должны указать отладчику передать исключение обратно в ваше приложение для нормальной обработки, нажав клавишу F9 или кнопку на панели инструментов "Выполнить", или настроить отладчик так, чтобы он игнорировал исключения.
Если вы запускаете приложение вне отладчика, то в показанном вами коде нет ничего плохого, что помешало бы catch
от ловли исключения в нормальных условиях.
Я использовал BCB5 в течение многих лет, и этот тип кода всегда работал хорошо для меня (хотя я всегда использую const
).