我有用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。有时我会收到此错误:
也就是说,发生了一个名为EConvertError的异常。
所以我的问题是:为什么这个异常没有被catch语句捕获?
答案 0 :(得分:14)
调试器在运行代码时显示此错误, 如果您运行exe并具有相同的情况,则不会向您显示错误消息
异常是抓住,但调试人员正在通知您有关代码中的错误
就在这里
try
{
Oversteering=HoursCounter.ToInt();
}
因为在调试器中运行,你试图将(空白空间)转换为整数,调试器将显示异常...但是当运行exe时,调试器将设置
Oversteering=0
查看
打破例外 在构建具有异常处理的程序时,您可能不希望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!");