【问题标题】:Exception is not caught although it is included in catch statement尽管异常包含在 catch 语句中,但未捕获异常
【发布时间】:2012-02-01 09:43:52
【问题描述】:

我有这个程序是用 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 语句捕获?

【问题讨论】:

  • 你试过捕捉 const 引用吗?
  • 代码sn-p中的语言确实是C++,但是类库与Delphi中使用的基本相同,在某些情况下可能看起来更像Delphi。
  • 在您的异常中,它提到“”不是有效的整数值。我假设您从字符串到 int 的转换没有发生,可能是因为空字符串。
  • @JoachimPileborg 谢谢,我现在明白了!
  • 顺便说一句:你能使用Delphi函数TryStrToInt()吗?

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


【解决方案1】:

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

异常已捕获,但调试器会通知您代码中的错误

就在这里

  try
     {
      Oversteering=HoursCounter.ToInt();
     }

由于在调试器中运行,您尝试将(空格)''转换为整数,调试器将显示异常...但是在运行 exe 时,调试器将设置

       Oversteering=0

about.com查看这个

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

【讨论】:

  • 你的意思不是“调试器”而不是“编译器”。调试代码时,编译器的工作已经完成。
  • 非常感谢@PresleyDias,看来它毕竟可以工作了 :) 我只是不习惯在捕获异常时看到真正的中断(我习惯于在 VS 中进行 C# 编程)。
  • 好的,当我开始使用 delphi 异常处理时,我遇到了一个烦人的问题,“你不能处理这个异常......!!!”然后我看到了 about.com 网站,它清除了它为什么会崩溃
【解决方案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!");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2020-02-28
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多