虽然它包含在catch语句中,但不会捕获异常

时间:2012-01-03 10:24:10

标签: c++ delphi c++builder pascal

我有用C ++ Builder 6编写的这个程序。我没有编写所有代码,只是编写了一些代码。然而,语言不是C ++(据我所知) - 它看起来更像是Delphi或Pascal。这就是我将它们全部包含在标签中的原因。

我有一个名为Oversteering的int。

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

HoursCounter是一个AnsiString,它的形式为int。

因为这是整个代码中唯一的try / catch语句(这不太好,我知道),我在Delphi / Pascal / ???中找不到任何好的例子,我不知道知道它是否写得正确。

好吧,我尝试将字符串转换为int。有时我会收到此错误:

error

也就是说,发生了一个名为EConvertError的异常。

所以我的问题是:为什么这个异常没有被catch语句捕获?

2 个答案:

答案 0 :(得分:14)

调试器在运行代码时显示此错误, 如果您运行exe并具有相同的情况,则不会向您显示错误消息

异常是抓住,但调试人员正在通知您有关代码中的错误

就在这里

  try
     {
      Oversteering=HoursCounter.ToInt();
     }

因为在调试器中运行,你试图将(空白空间)转换为整数,调试器将显示异常...但是当运行exe时,调试器将设置

       Oversteering=0

about.com

查看
  

打破例外   在构建具有异常处理的程序时,您可能不希望Delphi打破异常。如果您希望Delphi显示异常发生的位置,这是一个很棒的功能;但是,当您测试自己的异常处理时,它可能会很烦人。

答案 1 :(得分:2)

正如@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!");