代码之家  ›  专栏  ›  技术社区  ›  Erika

如何让Delphi知道我已经处理了异常?

  •  6
  • Erika  · 技术社区  · 17 年前

    我已将Application.OnException设置为自定义异常处理程序,以便记录崩溃并提供退出选项。然而,我现在发现,这甚至在我已经处理过的异常上运行,例如,在验证数字输入时出现的异常。有没有办法让自定义异常处理程序只在未处理的异常上运行?

    编辑:当我在调试器外部运行时,我得到了预期的行为。也许这只是调试器的事。至少可以说,我不认为Delphi调试器与异常的交互是直观的。

    4 回复  |  直到 17 年前
        1
  •  15
  •   Community Mohan Dere    6 年前

    你的程序

    Why do I continue getting error messages even after I have written an exception handler?

    摘录:

    没有一个 您的程序中有个异常处理代码尚未运行。它本身就是德尔福;它作为调试器的特殊状态允许它获得程序中任何异常的第一个通知,甚至在程序知道它之前。

    块在恢复程序之前,您可以使用各种调试工具。您可以检查范围中任何变量的值,甚至可以修改它们的值。

    那么,如何通知Delphi您已经处理了异常?你不知道,因为你的程序 还没处理好呢 离去

    我的文章接着介绍了一些避免调试器捕获某些异常的方法,总结如下:

    • 使用
    • 将调试器配置为忽略某些异常类(及其子类)。
    • 告诉调试器不要通知您 任何 例外情况。
    • 完全禁用集成调试。

    我的文章中没有包括其他选项:

    您说您正在验证数字输入。我觉得你好像在打电话 StrToInt 然后再去接电话 EConvertError 输入不是有效整数时发生异常。这是一种昂贵的验证输入的方法。相反,使用 TryStrToInt ,它将告诉您转换是否成功,或 StrToIntDef ,它将以静默方式返回默认值,而不是引发异常。另一个选择是老一套 Val ,它尝试转换字符串,如果失败,它会告诉您字符串中的哪个位置导致了失败。 如果您希望为转换使用尽可能多的字符,然后在下一个非数字字符处恢复解析,则此选项特别有用。

        2
  •  4
  •   Thomas Watnedal    17 年前

    引用TApplication.oneException上的文档(Delphi 7)

    "Use OnException to change the default behavior that occurs when an exception is not
    handled by application code."
    

    未处理的异常 将在OneException事件处理程序中可用。您所经历的可能是Delphi IDE在异常时崩溃。这是(至少在Delphi7中)可配置的。

        3
  •  1
  •   Bjarke Freund-Hansen najhi ullah    17 年前

    另一种选择可能是不使用Application.OneException。但只需捕获“main”函数中的所有异常。这样,您可以捕获以前未缓存的所有异常,记录异常,然后崩溃。

        4
  •  1
  •   C Harmon    17 年前

    Application.OneException应仅针对未处理的异常触发。在try-exception块中重新引发异常将导致Application.OneException处理该异常。对于引发异常的输入验证,您可以向用户显示一条消息,然后仅在希望将异常记录到错误日志中时才重新引发异常。

    推荐文章