d - 异常不受作用域语句进行处理

问题描述 投票:2回答:3

为什么这个代码导致运行时异常,当我希望它由scope语句来处理?

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

同样的运行时错误与scope(exit)被用来代替发生。

当与最不发达国家-run标志进行编译,我得到Error: message: Floating point exception (core dumped) Error: program received signal 2 (Interrupt)。 DMD患者,我得到Error: program killed by signal 8

d
3个回答
4
投票

这是一个处理器异常。该scope(failure)只发生于d语言异常(只包括32位Windows系统和处理器的东西!)。


2
投票

范围(失败),当Dlang异常倒掉时,才会执行。但是,在这种特殊情况下,这是一个错误的处理器,由你的操作系统被零detecing一个部门,着手杀死你的过程(因为它假定你的进程处于无效状态)捕获。正确的方法是捕获错误自己是不会执行非法操作(一个简单的if从句可以帮助解决由零问题这一特定部门,而是适用于段断层太)

(这听起来不是很实用,但设计权衡。最好让你的程序检查是否有无效的操作需要的时候事先比复杂的编译器,与非便携OS / CPU具体的东西和可移植性,过耦合的编译器/库(最重要的)减速总体性能,因为错误处理是继发生的事情)


0
投票

我在d编程的解释的解读是,该scope(failure)没有捕获或阻止例外,它只是确保代码在异常的情况下运行。有点像catch{}块,做一个异常的情况下的东西,然后再抛出同样的异常,但干净。

这本书(以及language spec)退出的范围,由于异常说话。如果scope捕获或防止异常那就不是导致执行离开该范围。

在使用pIND scope底部的示例还示出了object.Exception,即使代码包含多个scope(failure)语句。

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

© www.soinside.com 2019 - 2024. All rights reserved.