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

D-范围语句未处理的异常,d,D,为什么这段代码会在运行时导致异常,而我希望它是由语句处理的 void scopeTest(ref int i) { i = 10 / i; scope(failure) i = 0; } ... int j = 0; j.scopeTest; 使用scope(exit)时会发生相同的运行时错误 使用ldc使用-run标志编译时,我得到错误:消息:浮点异常(内核转储) 错误:程序接收到信号2(中断)。使用dmd,我得到错误:程序被信号8杀死 这是处理器异常。作用域(失败)仅在D语言异常(

为什么这段代码会在运行时导致异常,而我希望它是由语句处理的

void scopeTest(ref int i) {
  i = 10 / i;
  scope(failure) i = 0;
}
...
int j = 0;
j.scopeTest;
使用
scope(exit)
时会发生相同的运行时错误

使用ldc使用-run标志编译时,我得到
错误:消息:浮点异常(内核转储)

错误:程序接收到信号2(中断)
。使用dmd,我得到
错误:程序被信号8杀死

这是处理器异常。
作用域(失败)
仅在D语言异常(仅包括32位Windows上的系统和处理器!)时出现。

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


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

我对D中编程的解释是,
作用域(失败)
不会捕获或阻止异常,它只是确保代码在发生异常时运行。有点像一个
catch{}
块,它在异常情况下执行某些操作,然后重新抛出相同的异常,但更干净

这本书(和)提到由于异常退出作用域。如果
scope
捕获或阻止了异常,则不会导致执行离开该作用域

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


(我很有经验,但不是一个很有经验的D程序员。)

对不起,我很难理解这一点。您能否提供一个触发scope语句的“D语言异常”示例(不一定在上面的代码中)?
抛出新异常(“msg”)