当前位置:  开发笔记 > 开发工具 > 正文

如何找出Delphi函数可能抛出的异常?

如何解决《如何找出Delphi函数可能抛出的异常?》经验,为你挑选了4个好方法。

有没有一种好方法可以找出程序/函数可以在Delphi中引发哪些异常(包括它称为过程/函数)?

在Java中,您始终必须声明可以抛出哪些异常,但在Delphi中并非如此,这可能导致未处理的异常.

是否有任何代码分析工具可以检测未处理的异常?



1> Graza..:

(编辑:现在很明显,这个问题涉及设计时检查.)

新答案:

我无法说明是否有任何工具可以帮您查看.帕斯卡分析仪,其中之一,没有.

但是,我可以告诉你,在大多数Delphi应用程序中,即使有一个工具来检查这个,你也不会得到任何结果.

为什么?因为TApplication.Run()中的主消息循环包装了异常处理块中的所有HandleMessage()调用,该异常处理块捕获所有异常类型.因此,在大多数应用程序中,您将拥有约99.999%的代码的隐式/默认异常处理.在大多数应用程序中,此异常处理大约占您自己代码的100% - 未包含在异常处理中的0.001%的代码将是自动生成的代码.

如果有可用的工具来检查这个,则需要重写Application.run(),使其不包含异常处理.

(上一个答案: 可以指定Application.OnException事件处理程序来捕获其他异常处理程序未处理的所有异常.虽然这是运行时,因此可能不完全是你所追求的(听起来你想要的)在设计时识别它们,它确实允许你捕获任何其他地方未处理的异常.结合Jedi代码库中的JCLDebug等工具,你可以记录堆栈跟踪,找出发生异常的地点和原因,这将允许进一​​步调查,并在有罪的代码周围添加特定的异常处理或预防...)



2> Frederik Sli..:

我的猜测是你试图让Delphi表现得像Java,这不是一个好方法.我建议不要过多担心未处理的异常.在最坏的情况下,它们会冒泡到通用VCL异常处理程序并导致Windows消息对话框.在正常的应用程序中,他们不会停止应用程序.

编写良好的代码将记录可以引发的不同异常,以便您可以以有意义的方式处理它们.不推荐使用Catch-all处理程序,因为如果您不知道引发异常的原因,实际上无法知道该怎么做.我也强烈推荐madExcept.



3> PatrickvL..:

除了对"raise"关键字进行扫描之外,Delphi中没有语言结构可以告诉临时读者可以从方法中预期哪些异常.

在运行时,可以在每个方法中添加一个catch-all异常处理程序,但这是不可取的,因为它会降低执行速度.(这也很麻烦).

向方法添加异常处理块将向其添加一些汇编指令(即使未触发异常),这会在经常调用方法时形成可测量的减速.

确实存在一些可以帮助您分析运行时异常的库,例如madExcept,JclDebug和EurekaLog.这些工具可以记录有关异常的各种细节,强烈建议使用其中一种!



4> Jim McKeeth..:

简短的答案是没有工具可以完成您所说的内容,甚至扫描raise关键字也无法实现. EAccessViolationEOutOfMemory只是可以在任何地方引发的许多异常中的两个.

关于Delphi的一个基本要素是异常是分层的:所有定义的语言异常都来自Exception,尽管值得注意的是它实际上可以引发任何TObject后代.

如果要捕获在特定过程中引发的每个异常,只需将其包装在try/except块中,但如前所述,不建议这样做.

// Other code . . . 
try
  SomeProcedure()
except  // BAD IDEA!
  ShowMessage('I caught them all!');
end;

这将抓住所有东西,甚至是一个凸起的TObject的实例.虽然我认为这很少是最好的行动方案.通常,您希望使用try/finally块,然后允许全局异常处理程序(或最后一个try/except块)实际处理异常.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有