【问题标题】:How can I find out which procedure threw an exception in Delphi?如何找出 Delphi 中哪个程序引发了异常?
【发布时间】:2008-12-07 07:51:08
【问题描述】:

我正在使用 Delphi TApplication.OnException 事件来捕获未处理的异常

这很好用,但没有提供有关异常发生位置的足够信息 即“灾难性失败”

我怎样才能知道是哪个程序导致了错误发生?

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := MyExceptionHandler;
end;

procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin
  LogException (E.Message);     
  Application.ShowException( E );
end;

【问题讨论】:

    标签: delphi exception-handling


    【解决方案1】:

    您可以使用 exceptAddr 变量(系统单元)获取引发异常的内存地址。但是,如果您想要堆栈跟踪,您可以使用 3rdParty 工具 MadExcept、EurekaLog 或开源 JCLDebug(JCL 的一部分)之一。

    【讨论】:

      【解决方案2】:

      最简单快捷的方法是使用JCL 异常和调试支持。安装 JCL 后,确保将调试符号插入二进制文件(项目 -> JCL 调试专家 -> 插入此二进制文件的 JDBG 数据 -> 启用)并向项目添加 JCL 异常对话框(文件 -> 新建.. . -> 对话框 -> 异常对话框)。

      如果 JCL 安装程序未能将该对话框添加到对象存储库并且它没有出现(发生在我身上几次),请通过将 .pas 和 .dpr 文件从 jcl-install-dir\experts\debug\dialog 复制到您的项目并手动添加它们,或者关闭 Delphi,在文本编辑器中编辑 %DELHPIDIR%\bin\delphi32.dro 并添加类似这样的内容(当然是调整路径:)

      [P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG] 类型=表单模板 名称=异常对话框 页面=对话框 图标=P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG.ICO 描述=JCL 应用程序异常对话框 作者=绝地计划 默认主窗体=0 DefaultNewForm=0 祖先= [P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL] 类型=表单模板 名称 = 带有发送的异常对话框 页面=对话框 图标=P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.ICO 描述=JCL 应用程序异常对话框 作者=绝地计划 默认主窗体=0 DefaultNewForm=0 祖先=

      【讨论】:

        【解决方案3】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-08
          • 1970-01-01
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-24
          相关资源
          最近更新 更多