Исключение не перехватывается, хотя оно включено в оператор catch - PullRequest
2 голосов
/ 03 января 2012

У меня есть эта программа, написанная на C ++ Builder 6. Я написал не весь код, а только его часть.Язык, однако, не C ++ (насколько я знаю) - он больше похож на Delphi или Pascal.Вот почему я включил их все в теги.

У меня есть int с именем Oversteering.

try
{
    Oversteering=HoursCounter.ToInt();
}
catch(EConvertError &convertError)
{
    Oversteering=0;
}

HoursCounter - это AnsiString, и он находится в формеint.

Так как это единственный оператор try / catch во всем коде (я знаю, что это не слишком хорошо), и я не смог найти хорошего примера такого в Delphi / Pascal / ???Я не знаю, правильно ли это написано.

Ну, я пытаюсь преобразовать строку в int.Иногда я получаю эту ошибку:

error

То есть, произошло исключение EConvertError.

Поэтому мой вопрос: почему это исключение НЕ перехватываетсявыловить заявление?

Ответы [ 2 ]

14 голосов
/ 03 января 2012

Эта ошибка отображается отладчиком при запуске через код, если вы запустите exe и у вас такая же ситуация, сообщение об ошибке не будет показано вам

Исключение составляет перехвачено но отладчик уведомляет вас об ошибке в коде

, которая находится здесь

  try
     {
      Oversteering=HoursCounter.ToInt();
     }

с момента запуска в отладчике, ваша попытка преобразовать (пустое пространство) '' в целое число,отладчик покажет исключение ... но при запуске exe, отладчик установит

       Oversteering=0

проверить это с about.com

BreakОб исключениях При создании программы с обработкой исключений вы можете не захотеть, чтобы Delphi разбивал исключения.Это отличная возможность, если вы хотите, чтобы Delphi показывал, где произошло исключение;однако это может раздражать при тестировании собственной обработки исключений.

2 голосов
/ 04 января 2012

Как объяснил @PresleyDias, исключение отображает отладчик, а не ваше приложение. Обнаружено исключение (хотя вы должны отлавливать его по ссылке const), но отладчик видит это раньше, чем ваше приложение, вот и все. Вы можете настроить отладчик на игнорирование EConvertError, если хотите.

Лучшее решение - избежать исключения. Если вместо этого вы используете AnsiString::ToIntDef(), вы можете полностью удалить блок try/catch:

Oversteering = HoursCounter.ToIntDef(0); 

В качестве альтернативы вы можете использовать TryStrToInt() вместо:

if (!TryStrToInt(HoursCounter, Oversteering))
{
    ...;
}

Если 0 является допустимым значением для вашего счетчика, используйте TryStrToInt():

if (TryStrToInt(HoursCounter, Oversteering))
{
    // use Oversteering as needed, even zeros...
}
else
    ShowMessage("Cannot convert HoursCounter to a valid integer!");

Если 0 всегда представляет ошибку, используйте ToIntDef():

Oversteering = HoursCounter.ToIntDef(0);
if (Oversteering != 0)
{
    // use Oversteering as needed, except zeros...
}
else
    ShowMessage("Cannot convert HoursCounter to an acceptable integer!");
...