Delphi可以告诉我抛出异常的例程的名称吗?

RBA*_*RBA 3 delphi exception-handling exception delphi-7

我知道如何在delphi中捕获异常(try..except/finally和e.message)但我想知道是否存在异常处理机制,它可以引发异常以及引发异常的例程的名称.通过例子

procedure/function bla();//this can be in a unit/class
begin
 code....
 an error  is raised here -> inside or not of an try-except/finally block 
end;
Run Code Online (Sandbox Code Playgroud)

我将收到一条消息/对象/任何指示我'bla'中出现错误'x'的内容.

我知道关于madexcept,有另一种方法来捕捉异常吗?

我正在使用Delphi 7.解决方案也可能适用于其他Delphi版本.

RRU*_*RUZ 7

您可以使用JCL库中属于ProcByLevelJclDebug.pas单元的功能.

在使用之前,您必须'Insert JDBG data into the binary'从Ide Menu工具 - > jcl选项中激活该选项.

替代文字

然后你可以这样使用它

Uses
 JclDebug;

procedure TForm18.Button1Click(Sender: TObject);
begin
    try

       raise  Exception.Create('Hello from '+ProcByLevel(0));
    except
         on e : Exception do
         ShowMessage(e.Message);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

结果是这样的

替代文字


Chr*_*ton 7

EurekaLog也是一款优秀的工具,与MadExcept相当.


Tri*_*dad 6

像MadExcept这样的库会向应用程序添加元数据,因此它可以将地址映射到单元和函数名称.

Delphi不会自动执行此操作,也不提供直接执行的操作,它只提供引发异常的地址.

做你想做的一些替代方案是:

有了这些,您可以在发生异常时获取调用堆栈的快照.


Eri*_*les 5

另请参阅JCLDebug的JCLLastExceptStackListToStrings(),它为您提供了异常点的良好堆栈转储.

就像TheNewbie所说:你通过将TApplication.OnException设置为错误处理程序的地址来实现这一点.