D - 范围语句未处理的异常

D - Exception not handled by scope statement

为什么这段代码在 运行 时间内导致异常,而我希望它由 scope 语句处理?

void scopeTest(ref int i) {
  i = 10 / i;
  scope(failure) i = 0;
}
...
int j = 0;
j.scopeTest;

使用 scope(exit) 时会发生相同的 运行 时间错误。

在使用 ldc 使用 -运行 标志进行编译时,我得到 Error: message: Floating point exception (core dumped) Error: program received signal 2 (Interrupt)。使用 dmd,我得到 Error: program killed by signal 8

这是处理器异常。 scope(failure) 仅发生在 D 语言异常(仅包括 32 位 Windows 上的系统和处理器事物!)。

scope(failure) 仅在抛出 Dlang 异常时执行。但在这种特殊情况下,这是一个处理器错误,由您的操作系统检测到被零除并继续终止您的进程(因为它假定您的进程处于无效状态)。正确的方法是自己捕获错误永远不要执行无效操作(一个简单的 IF 子句可以帮助解决这个特定的被零除问题,但也适用于段错误)

(这听起来不太实用,但它是一种设计权衡。最好让你的程序在需要时检查无效操作,而不是让编译器复杂化、可移植性、过度耦合 compilers/libraries 与非便携 OS/CPU 特定的东西和(最重要的)降低整体性能,因为错误处理发生在之后)

我看《Programming in D》的解释是,scope(failure)并没有捕获或阻止异常,它只是确保代码在发生异常时运行。有点像 catch{} 块,在异常情况下做一些事情,然后重新抛出相同的异常,但更干净。

这本书(和language spec)谈到由于异常而退出作用域。如果 scope 捕获或阻止了异常,那么它不会导致执行离开该范围。

PinD scope 底部的示例也显示了 object.Exception,即使代码包含多个 scope(failure) 语句。

(我是一个经验丰富但不是非常有经验的D程序员。)