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程序员。)
为什么这段代码在 运行 时间内导致异常,而我希望它由 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程序员。)