我已将Application.OnException设置为自定义异常处理程序,以便我可以记录崩溃并提供退出选项.但是,我现在发现这甚至在我已经处理的异常上运行,例如,在验证数字输入时出现的异常.有没有办法让自定义异常处理程序只在未处理的异常上运行?
编辑:事实证明,当我在调试器外部运行时,我得到了预期的行为.也许这只是一个调试器的事情.至少可以说,我没有发现Delphi调试器与异常的交互是直观的.
Rob*_*edy 14
如果行为在调试器内部和外部发生变化,那么实际上并不是您的程序会告诉您有关异常的信息.我在我的网站上写过这个现象:
摘录:
在默认设置中,只要程序中发生异常,Delphi IDE就会通知您.... 什么是重要的是要意识到的是,在这一点上,没有你的程序的例外处理代码还没有运行.这都是德尔福本身; 它作为调试器的特殊状态允许它获得程序中任何异常的第一个通知,甚至在程序知道它之前.
在您关闭Delphi的消息框后,执行将暂停在源代码的最佳行中,Delphi可以找到代表异常的来源.按"运行"按钮可恢复程序.控制将传递到下一个finally或except块.在恢复程序之前,您可以使用各种调试工具.您可以检查范围内任何变量的值,甚至可以修改它们的值.
那么,您如何通知Delphi您已经处理了异常?你没有 - 因为你的程序尚未处理它.为什么调试器无法检测您的程序是否会处理异常?因为为了做到这一点,它需要进一步执行你的程序.检测缺少异常处理程序就像解决暂停问题一样.确定是否要处理异常的唯一方法是让程序运行,然后查看异常是否得到处理.但到那时,进行任何调试都为时已晚,因此调试器别无选择,只能在程序第一次检测到异常时暂停程序,然后让你弄清楚该怎么做.
我的文章继续描述一些可以避免调试器捕获某些异常的方法,总结如下:
我的文章中没有包含其他选项:
你说你正在验证数字输入.这听起来像你正在做的事情就像调用StrToInt
然后EConvertError
在输入不是有效整数时捕获异常.这是一种验证输入的昂贵方法.而不是使用TryStrToInt
,它将告诉您转换是否成功,或者StrToIntDef
,它将静默返回默认值而不是引发异常.另一种选择是普通旧Val
,它试图转换一个字符串,如果它失败,它会告诉你字符串中的哪个位置导致失败.Val
如果要为转换使用尽可能多的字符,然后在下一个非数字字符处继续解析,则特别有用.
归档时间: |
|
查看次数: |
4016 次 |
最近记录: |