D - 范围语句未处理异常

时间:2018-04-15 01:52:14

标签: d

为什么这段代码会在运行时导致异常,我希望它由http://php.net/manual/en/function.move-uploaded-file.php语句处理?

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

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

(它听起来不太实用,但是设计权衡。更好地让您的程序在需要时检查无效操作和BEFOREHAND比复杂的编译器,可移植性,过度耦合编译器/库与非便携式操作系统/ CPU特定的东西和(最重要的)减慢整体性能,因为错误处理发生在AFTERWARDS之后)

答案 2 :(得分:0)

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

书(和language spec)发言的离开的范围由于一个异常即可。如果scope捕获或阻止了异常,则不会导致执行离开该范围。

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

(我一个漂亮的经历,但不是非常有经验的程序员d。)