有没有好的方法可以找到 Delphi 程序/函数可能抛出的异常(包括其调用程序/函数)?
在 Java 中,您总是需要声明可能抛出的异常,但在 Delphi 中并非如此,这可能会导致未处理的异常。
是否有任何代码分析工具可以检测到未处理的异常?
有没有好的方法可以找到 Delphi 程序/函数可能抛出的异常(包括其调用程序/函数)?
在 Java 中,您总是需要声明可能抛出的异常,但在 Delphi 中并非如此,这可能会导致未处理的异常。
是否有任何代码分析工具可以检测到未处理的异常?
(编辑:现在显然问题只涉及设计时检查。)
新答案:
我无法确定是否有工具可以为您进行此项检查。例如,Pascal分析器就没有这个功能。
但是,我可以告诉你,在大多数Delphi应用程序中,即使有工具可以为您进行此项检查,您也不会得到任何结果。
为什么?因为TApplication.Run()中的主消息循环将所有HandleMessage()调用都包装在一个异常处理块中,它捕获了所有异常类型。因此,在大多数应用程序中,您将隐含/默认地处理99.999%的代码。在大多数应用程序中,这种异常处理将占用您自己代码的100% - 0.001%未被包裹在异常处理中的代码将是自动生成的代码。
如果有可用的工具可以为您进行此项检查,您需要重写Application.run(),使其不包括异常处理。
(以前的答案:Application.OnException事件处理程序可以被分配来捕获所有没有被其他异常处理程序处理的异常。虽然这是运行时,因此可能不完全是您想要的(听起来像是您想在设计时识别它们),但它确实允许您捕获任何其他地方未处理的异常。结合像Jedi Code Library中的JCLDebug等工具,您可以记录堆栈跟踪以查明异常发生的位置和原因,这将允许进一步调查并在有罪代码周围添加特定的异常处理或预防措施...)
我猜你想让Delphi的行为像Java一样,这不是一个好的方法。我建议不要过于担心未处理的异常。最坏的情况下,它们会冒泡到通用的VCL异常处理程序,并导致Windows消息对话框。在正常的应用程序中,它们不会停止应用程序。
良好编写的代码将记录可能引发的不同异常,以便您可以有意义地处理它们。不推荐使用全捕捉处理程序,因为如果您不知道为什么引发异常,实际上没有办法知道该做什么。我还强烈推荐madExcept。
// Other code . . .
try
SomeProcedure()
except // BAD IDEA!
ShowMessage('I caught them all!');
end;
这将捕获所有内容,甚至包括引发的TObject实例。虽然我认为这并不是最好的做法。通常情况下,您应该使用try / finally块,然后允许全局异常处理程序(或一个最终的try / except块)来处理异常。
try
ThisFunctionMayFail;
except
// but it sure won't crash the application
on e:exception
do begin
// something sensible to handle the error
// or perhaps log and/or display the the generic e.description message
end
end;
如果需要运行时异常处理,可以尝试使用Eurekalog工具。我不知道是否有设计时的工具。当你使用第三方代码且没有源代码时,可能会遇到更多困难。在Delphi中,捕获异常是不必要的,因此你不需要像Java一样声明它们。
我的意思是,Delphi不要求必须处理异常,它只会终止程序。EurekaLog提供了记录已处理和未处理异常的方法,并在异常发生时提供了大量有关程序状态的信息,包括发生异常的代码行和调用堆栈。
单元的终结部分也可能会引发异常。我认为这些异常可能会被忽略...并且也有一些问题。
我认为Delphi IDE有一个内置的“堆栈跟踪”或“堆树”之类的东西。
这个问题让我想起了Skybuck的TRussianRoulette游戏...搜索一下,它的代码和答案可能会有所帮助。