我知道如何在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版本。
答案 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;
。
然后你可以这样使用它
{{1}}
,结果是这样的
答案 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.