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

Delphi 11用DUnitx单元测试时如何按项目关闭异常通知

Delphi 11下针对DUnitX项目单独关闭异常通知的方案

全局修改Tools > Options里的Language Exceptions开关确实会对所有项目生效,不需要这么做,有三种非全局的实现方式,按需选择即可:

1. 项目级独立配置(推荐,无代码侵入)

Delphi从XE版本开始就支持项目维度的调试异常配置,配置仅对当前项目生效,不会修改全局设置:

  • 右键点击项目管理器中的DUnitX测试项目,选择Options
  • 导航到Debugger > Exceptions页签
  • 直接取消勾选Notify on language exceptions,或者按需将测试中预期抛出的特定异常类型加入忽略列表
  • 保存项目即可,配置会写入项目的.dproj文件,只有调试该项目时会生效,其他普通业务项目的异常通知逻辑完全不受影响

2. DUnitX测试运行器专属配置

如果你是通过IDE内置的Test Explorer面板运行DUnitX用例:

  • 打开Test Explorer面板右上角的设置菜单
  • 取消勾选Break on test exceptions选项
  • 该配置仅对DUnitX测试运行流程生效,哪怕你调试同一个项目里的非测试代码,异常通知也会正常触发,是对日常开发影响最小的方案

3. 代码控制仅测试运行时临时屏蔽异常

如果需要更灵活的控制(比如只在跑全量测试时屏蔽,单独调试单个测试用例时保留异常通知),可以在测试项目的源码入口加条件控制逻辑:

program YourDUnitXTestProject;

uses
  Winapi.Windows,
  DUnitX.TestFramework,
  DUnitX.Loggers.Console,
  // 引用自己的测试单元
  ;

{$IFDEF DEBUG}
procedure DisableDebuggerExceptionPause;
var
  prevMode: DWORD;
begin
  // 屏蔽系统级错误弹窗
  SetThreadErrorMode(SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX, @prevMode);
  // 通知IDE调试器不要在当前进程暂停在语言异常
  OutputDebugString('$DUnitX:SKIP_EXCEPTION_BREAK');
end;
{$ENDIF}

begin
{$IFDEF DEBUG}
  // 仅调试器附加、且传入testrun参数时才屏蔽异常
  if IsDebuggerPresent and FindCmdLineSwitch('testrun') then
    DisableDebuggerExceptionPause;
{$ENDIF}
  // 原有DUnitX启动逻辑
  TDUnitX.Start;
end.

后续在Test Explorer里配置运行参数加-testrun,单独调试项目时不加这个参数,就可以灵活切换异常通知状态。

注意:不要开启测试项目的Use debug .dcus选项,否则哪怕关了语言异常通知,调试器也会在RTL/VCL内部抛出异常时断下,影响测试运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:48:21