- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已将 Application.OnException 设置为自定义异常处理程序,以便我可以记录崩溃并提供退出选项。然而,我现在发现,即使在我已经处理过的异常上,它也会运行,例如,验证数字输入时出现的异常。有没有办法让自定义异常处理程序仅在未处理的异常上运行?
编辑:事实证明,当我在调试器之外运行时,我得到了预期的行为。也许这只是一个调试器的事情。至少可以说,我认为 Delphi 调试器与异常的交互并不直观。
最佳答案
如果调试器内部和外部的行为发生变化,那么告诉您异常的并不是真正的您的程序。我在我的网站上写过有关此现象的文章:
Why do I continue getting error messages even after I have written an exception handler?
摘录:
In its default settings, the Delphi IDE notifies you whenever an exception occurs in your program ... . What’s important to realize is that at that point, none of your program’s exception-handling code has run yet. It’s all Delphi itself; its special status as a debugger allows it to get first notification of any exception in your program, even before your program knows about it.
After you dismiss Delphi’s message box, execution will be paused at the best line of your source code Delphi could find to represent the source of the exception. Press the “Run” button to have your program resume. Control will pass to the next finally or exceptblock. Before you resume your program, you may use the various debugging tools at your disposal. You can inspect the values of any variables in scope, and you can even modify their values.
那么,如何通知 Delphi 您已经处理了异常呢?你不需要——因为你的程序还没有处理它。为什么调试器无法检测您的程序是否要处理异常?因为为了做到这一点,它需要进一步执行您的程序。检测异常处理程序的缺失就像解决停止问题一样。确定是否要处理异常的唯一方法是让程序运行,然后查看异常是否得到处理。但到那时,进行任何调试都为时已晚,因此调试器别无选择,只能在第一次检测到异常时暂停程序,然后让您弄清楚要做什么。
我的文章继续描述了一些可以避免调试器捕获某些异常的方法,总结如下:
还有另一个选项我没有包含在我的文章中:
您说您正在验证数字输入。在我看来,您正在执行类似调用 StrToInt
的操作,然后在输入不是有效整数时捕获 EConvertError
异常。这是一种验证输入的昂贵方法。相反,请使用 TryStrToInt
,它会告诉您转换是否成功,或者使用 StrToIntDef
,它会默默地返回默认值而不是引发异常。另一个选项是普通的旧 Val
,它尝试转换字符串,如果失败,它会告诉您字符串中的哪个位置导致失败。如果您希望使用尽可能多的字符进行转换,然后在下一个非数字字符处恢复解析,Val
特别有用。
关于delphi - 我如何让 Delphi 知道我已经处理了异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1234950/
我是一名优秀的程序员,十分优秀!