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

时间:2010-11-10 16:33:44

标签: delphi exception exception-handling 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;

我将收到一条消息/对象/任何表明我在'bla'中引发错误'x'的内容。

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

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

7 个答案:

答案 0 :(得分:7)

您可以使用ProcByLevel库中JclDebug.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;

alt text

然后你可以这样使用它

{{1}}

,结果是这样的

alt text

答案 1 :(得分:7)

EurekaLog也是一款优秀的工具,与MadExcept相同。

答案 2 :(得分:6)

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

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

做你想做的事情的其他选择是:

有了这些,你可以在异常发生时获得调用堆栈的快照。

答案 3 :(得分:5)

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

就像TheNewbie所说的那样:通过将TApplication.OnException设置为错误处理程序的地址来获得此结果。

答案 4 :(得分:3)

不,Delphi没有任何内置的“获取当前功能的名称”功能。 MadExcept或类似产品可能是在错误报告中获得有意义名称的最佳方式。

答案 5 :(得分:3)

MadExcept是我到目前为止找到的最佳解决方案,当然,如果您的需求不是太花哨而且您的项目是商业化的,那么您应该检查Project JEDI的JCL(特别是JclDebug.pas)。在那里你会发现许多有用的例程。它支持.MAP文件,TurboDebugger符号等。另外,使用它可以嵌入调试信息(与MadExcept一样)。

您可能还想查看TApplication.OnException(和相关的)。

答案 6 :(得分:2)

正如其他人所说...... JCL有一些不错的功能......

在您的应用程序中......您需要设置一些信息以获得Hook所需的堆栈框架。
项目 - >编译器 - >堆栈帧...我也检查了所有调试并添加以下内容...项目 - >选项 - >链接器 - >地图文件(选择详细)/包括TD32调试信息

在我的记录器单元中......我有这个......你必须拥有自己的TLogger ......为你保存信息......

use
  JclDebug, JclHookExcept;


procedure HookGlobalException(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
  a_List: TStringList;
  a_Error: string;
begin
  if Assigned(TLogger._Instance) then
  begin
    a_List := TStringList.Create;
    try
      a_List.Add(cStar);
      a_Error := Exception(ExceptObj).Message;
      a_List.Add(Format('{ Exception - %s }', [a_Error]));
      JclLastExceptStackListToStrings(a_List, False, True, True, False);
      a_List.Add(cStar);
      // save the error with stack log to file
      TLogger._Instance.AddError(a_List);
    finally
      a_List.Free;
      Raise Exception.Create(a_Error);
    end;
  end;
end;

initialization
  Lock := TCriticalSection.Create;
  Include(JclStackTrackingOptions, stTraceAllExceptions);
  Include(JclStackTrackingOptions, stRawMode);

  // Initialize Exception tracking
  JclStartExceptionTracking;

  JclAddExceptNotifier(HookGlobalException, npFirstChain);
  JclHookExceptions;

finalization
  JclUnhookExceptions;
  JclStopExceptionTracking;
  Lock.Free;

end.