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

为何这段D语言代码运行时触发异常,未被scope语句处理?

为什么你的D语言scope语句没处理除以零的异常?

核心问题在于:你代码里触发的不是可恢复的Exception,而是不可恢复的Error,这类错误会直接终止程序,根本不会给scope语句执行的机会。

1. D语言中Error和Exception的关键区别

D语言把运行时错误分成两类:

  • Exception:这类是预期内的、可恢复的错误(比如文件找不到、网络断开),可以用try-catch捕获,也会触发scope(failure)这类清理逻辑。
  • Error:这类是严重的、不可恢复的底层错误(比如除以零、空指针解引用、内存访问越界),设计上就是用来直接终止程序的——运行时不会尝试捕获它们,也不会执行函数退出时的清理代码(包括scope(failure)和scope(exit))。

你的代码里i=0时执行10/i,触发的是FloatingPointError,属于Error范畴。当这个错误发生时,操作系统会直接发送信号终止你的程序,D运行时根本没机会去执行scope块里的代码。

2. 为什么scope(exit)也没用?

scope(exit)的设计是在函数正常退出(不管是return还是抛出Exception)时执行,但如果程序因为Error直接崩溃,函数的正常退出流程被打断了,自然也不会执行scope(exit)的逻辑。

3. 怎么解决这个问题?

既然除以零属于不可恢复的Error,你需要在执行除法前主动检查除数是否为零,提前处理:

void scopeTest(ref int i) {
    if (i == 0) {
        i = 0;
        return;
    }
    i = 10 / i;
    scope(failure) i = 0; // 现在只有当其他Exception抛出时才会触发
}

// 调用
int j = 0;
j.scopeTest; // 不会再崩溃,j会被设为0

这样就能避免触发浮点错误,同时保留scope(failure)处理其他可能的Exception场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:10