加
抛
为函数属性
理由
当前,默认情况下允许函数引发异常.可以通过应用
不抛
属性来更改此行为.但一旦
不抛
在
模块域或块
中使用,其域中的所有函数都会受到影响;
因此聚合
不继承
从外部域的
不抛
属性.如需要整个模块
不抛
,那么该属性不仅必须在模块域内应用,而且必须在每个聚合的定义内应用:
空 栏(); //可抛
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#
)具有安全性,可
选出
而不是
选进
.