代码之家  ›  专栏  ›  技术社区  ›  RBA

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

  •  3
  • RBA  · 技术社区  · 14 年前

    我知道如何在Delphi中捕获异常(尝试……除了/EXT和E.Mead),但是我想知道是否存在一个异常处理机制,它可以引发异常以及引发它的例程的名称。以身作则

    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”的内容。

    我在用Delphi7。该解决方案也适用于其他Delphi版本。

    7 回复  |  直到 9 年前
        1
  •  7
  •   RRUZ    14 年前

    你可以使用 ProcByLevel JclDebug.pas 单位wich是 JCL 图书馆。

    在使用之前,必须激活选项 'Insert JDBG data into the binary'

    alt text

    然后你就可以用这种方式

    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

        2
  •  7
  •   Chris Thornton    14 年前

    EurekaLog也是一个很好的工具,与madexter不相上下。

        3
  •  6
  •   Trinidad    11 年前

    Delphi并不是自动地这样做,也不提供直接这样做的方法,它只是提供引发异常的地址。

    有了它们,您可以在异常发生时获取调用堆栈的快照。

        4
  •  5
  •   Erik Knowles    14 年前

    还可以看看JCLDebug的JCLLastExceptStackListToStrings(),它为异常点提供了一个很好的堆栈转储。

    正如newbie所指出的:您可以通过将TApplication.OnException设置为错误处理程序的地址来实现这一点。

        5
  •  3
  •   Mason Wheeler    14 年前

        6
  •  3
  •   TheNewbie    14 年前

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

        7
  •  2
  •   House of Dexter    11 年前

    正如其他人所说…JCL有一些很好的特性。。。


    项目-->编译器->堆栈帧…我还检查了所有调试,并添加以下内容…项目->选项->链接器->映射文件(选择详细信息)/包括TD32调试信息

    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.