为什么这段代码会在运行时导致异常,我希望它由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
。
答案 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。)