天天看点

d语言的改进:默认不抛与安全

为函数属性

理由

当前,默认情况下允许函数引发异常.可以通过应用

不抛

属性来更改此行为.但一旦

不抛

模块域或块

中使用,其域中的所有函数都会受到影响;

因此聚合

不继承

从外部域的

不抛

属性.如需要整个模块

不抛

,那么该属性不仅必须在模块域内应用,而且必须在每个聚合的定义内应用:

空 栏(); //可抛
struct  S1 {
     不抛 void foo(){bar();}//错误,bar()抛
}

不抛{
     struct S2{
         void foo(){bar();}//正确,因为未应用`不抛`
    }
}
           

问题是,即使在永

不抛

的代码中,异常成本很高.因此,异常应该是

选进

,而不是

选出

.尽管此DIP不建议

启用异常

,但

属性是其关键要求.该属性对文档也有帮助,是的,函数确实

可抛

.

先前工作

@安全,@信任和@系统

属性可互相覆盖.

描述

到属性.加

函数属性

.这与

抛语句

的开头有歧义, 但可向前看是否

后有个

声明

来消歧.

该属性仅适用于

函数和闭包

类型,忽略其他类型.如在函数声明中出现,则表明该函数

可抛

出异常.

空 bar()抛 ;

struct S1 {
     不抛 void foo(){bar();}//错误,bar()抛
}

struct S2 {
     void foo(){bar();} //正确 
}
           

不能同时

不抛

,但可在

闭域

内相互覆盖:

空 abc()抛 抛 ;   //错误
void  bar()抛 不抛 ; //错误

不抛:
    foo()抛 ; //好

抛:
    def()不抛 ; //好
           

语法变化

函数属性

:

函数属性:

  • 不抛

    属性

重大变更和弃用

参考

Herb Sutter在"去碎片化的C++"的

使异常更便宜且有用

中说:“一半以上C++用户在C++代码中全部或部分禁止了异常”.

@安全

设为默认值

当前,D函数默认为@系统.本DIP建议将默认值改为

@安全

.

理由

最初开发D时,几乎不额外检查安全@安全.但,随着不安全代码的成本

越来越明显和昂贵

,且

@安全函数

越来越强大,平衡已发生了变化.用户期望默认

安全

,而不是相反.

先前工作

其他语言(如

Rust和C#

)具有安全性,可

选出

而不是

选进

.

描述

重大变更和弃用