You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi 11中获取异常发生的具体窗体及代码行号?

在Delphi 11中获取异常发生的窗体及代码行号

获取代码行号

要拿到异常对应的具体代码行号,必须依赖编译时生成的调试信息,操作步骤如下:

  1. 启用调试信息生成:
    打开项目选项,进入「Delphi Compiler」→「Linking」,勾选「Generate debug info」;在「Output - Map file」下拉菜单中选择「Detailed」,确保编译时生成完整的map文件。
  2. 解析异常地址获取行号:
    在except块中用ExceptAddr获取异常发生的内存地址,若不想手动解析map文件,可使用第三方库简化操作,比如JCL的JclDebug单元,示例代码如下:
    uses JclDebug;
    
    try
      raise Exception.Create('Test');
    except
      on E: Exception do
      begin
        var StackTrace := JclDebug.JclCreateStackTrace;
        try
          ShowMessage(E.Message + ' on line ' + StackTrace.Items[0].Line.ToString);
        finally
          StackTrace.Free;
        end;
      end;
    end;
    

获取异常发生的窗体

定位异常所属窗体,常用两种方式:

  • 通过调用栈关联单元:
    利用栈回溯工具(如JCL的栈回溯功能)获取异常发生位置的单元名,通常窗体的逻辑代码都在对应窗体的单元中(比如TForm1对应Unit1.pas),通过单元名可关联到具体窗体。
  • 上下文捕获窗体实例:
    如果异常在窗体的事件处理方法(如按钮点击、窗体创建)中抛出,可直接在异常捕获时访问当前窗体实例,比如用Self.Name或Self.ClassName获取窗体标识。

注意事项

  • Debug模式默认启用调试信息,Release模式需手动开启,但开启后会增大程序体积。
  • 第三方库(如JCL、EurekaLog)能大幅简化异常信息收集,除行号和窗体外,还能生成完整调用栈,是生产环境的常用选择。

内容的提问来源于stack exchange,提问作者delphirules

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:20:20