有没有一种好方法可以找出程序/函数可以在Delphi中引发哪些异常(包括它称为过程/函数)?
在Java中,您始终必须声明可以抛出哪些异常,但在Delphi中并非如此,这可能导致未处理的异常.
是否有任何代码分析工具可以检测未处理的异常?
(编辑:现在很明显,这个问题仅涉及设计时检查.)
新答案:
我无法说明是否有任何工具可以帮您查看.帕斯卡分析仪,其中之一,没有.
但是,我可以告诉你,在大多数Delphi应用程序中,即使有一个工具来检查这个,你也不会得到任何结果.
为什么?因为TApplication.Run()中的主消息循环包装了异常处理块中的所有HandleMessage()调用,该异常处理块捕获所有异常类型.因此,在大多数应用程序中,您将拥有约99.999%的代码的隐式/默认异常处理.在大多数应用程序中,此异常处理大约占您自己代码的100% - 未包含在异常处理中的0.001%的代码将是自动生成的代码.
如果有可用的工具来检查这个,则需要重写Application.run(),使其不包含异常处理.
(上一个答案: 可以指定Application.OnException事件处理程序来捕获其他异常处理程序未处理的所有异常.虽然这是运行时,因此可能不完全是你所追求的(听起来你想要的)在设计时识别它们,它确实允许你捕获任何其他地方未处理的异常.结合Jedi代码库中的JCLDebug等工具,你可以记录堆栈跟踪,找出发生异常的地点和原因,这将允许进一步调查,并在有罪的代码周围添加特定的异常处理或预防...)
我的猜测是你试图让Delphi表现得像Java,这不是一个好方法.我建议不要过多担心未处理的异常.在最坏的情况下,它们会冒泡到通用VCL异常处理程序并导致Windows消息对话框.在正常的应用程序中,他们不会停止应用程序.
编写良好的代码将记录可以引发的不同异常,以便您可以以有意义的方式处理它们.不推荐使用Catch-all处理程序,因为如果您不知道引发异常的原因,实际上无法知道该怎么做.我也强烈推荐madExcept.
除了对"raise"关键字进行扫描之外,Delphi中没有语言结构可以告诉临时读者可以从方法中预期哪些异常.
在运行时,可以在每个方法中添加一个catch-all异常处理程序,但这是不可取的,因为它会降低执行速度.(这也很麻烦).
向方法添加异常处理块将向其添加一些汇编指令(即使未触发异常),这会在经常调用方法时形成可测量的减速.
确实存在一些可以帮助您分析运行时异常的库,例如madExcept,JclDebug和EurekaLog.这些工具可以记录有关异常的各种细节,强烈建议使用其中一种!
简短的答案是没有工具可以完成您所说的内容,甚至扫描raise关键字也无法实现. EAccessViolation或EOutOfMemory只是可以在任何地方引发的许多异常中的两个.
关于Delphi的一个基本要素是异常是分层的:所有定义的语言异常都来自Exception,尽管值得注意的是它实际上可以引发任何TObject后代.
如果要捕获在特定过程中引发的每个异常,只需将其包装在try/except块中,但如前所述,不建议这样做.
// Other code . . . try SomeProcedure() except // BAD IDEA! ShowMessage('I caught them all!'); end;
这将抓住所有东西,甚至是一个凸起的TObject的实例.虽然我认为这很少是最好的行动方案.通常,您希望使用try/finally块,然后允许全局异常处理程序(或最后一个try/except块)实际处理异常.