当前位置:   article > 正文

2402d,d值类型异常

2402d,d值类型异常

原文

原理

值类型异常是一个新的处理代码基中不需要堆内存分配或运行时机制来执行的替代路径机制.它围绕从函数中(基于类和结构)抛异常新属性设计的.
推导属性可避免编译器过度写入抱怨.

原理

目前,D语言中的异常或需要几乎没有语言辅助显式类型,或需要运行时信息展开库来辅助它.

两个方法都不可取.相反,此DIP旨在实现:
1,无(堆)内存分配.
2,使用标准的throwtry catch语句.
3,不直接给用户提供运行时库或信息,这使它适合betterC代码和资源受限系统.
4,不会引入在所有代码基中都有侵入性的新语法.

最好,允许删除throw,nothrowThrowable子项的默认值.

这些限制,允许在异常处理函数指针不管用的时候在GPU上的异常工作.

先前工作

@throws属性的一个关键特征是,一般可推导出.这与Java类语言严重依赖IDE支持来自动设置列表中内容的校验异常相反.

异常语法和机制替代方法错误返回或可选数据.错误返回可带错误码.

该机制按标签联实现.就性能而言,与同类错误方法可最直接的比较.

该设计源于HerbSutter零成本确定性异常论文,EmilDotchevski修改机制可见更多属性.

使用HerbSutter在他的论文中提出的表格:
A."错误"流与"成功"不同的是,两者都通过抛和抓抛和处理.
B.错误传播和处理"是"表示仅显式写入抓,自动传播未处理错误,很容易编写错误保留错误中立函数.

未处理错误传播,除非调用者显式写入非空throws属性,"否"是可见的.

C.对非堆(都是栈分配)是零成本和确定性是(Yes),静态类型,除了标签联标识外,不需要运行时信息,空间/时间成本等于返回(标签联,匹配原始表中的其他值),且(根据原始表中的其他项目)是完全确定的.

BS该异常处理风格的一些批评,可通过推导属性来解决,除非在处理函数指针或想犯错时,否则不需要关心@throws属性.

zig

描述

DIP添加了新的属性特征抛和抓异常的机制.

由编译器内部存储类型集合表示该属性.有效类型是从Throwable继承的结构,类或接口.

所有函数都自动推导属性,如果集合不匹配提供的属性,则将出错.

int add(int x, int y) {
    return x + y;
}
  • 1
  • 2
  • 3

上例,在不添加throws属性时,表明需要推导它.上例,它不会,因此会有个空集.可用代码重写为@throws().

struct MyException {
    int someData;
    string lastThrow, originalThrow;
}
int add(int x, int y) {
    if (x == y)
        throw MyException(x + y);
}
int add2(int x, int y) {
    try {
        return add(x, y);
    } catch(MyException e) {
        stderr.writeln("Oh noes... something happened: ", e.originalThrow);
        return e.someData;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

上例中,add有按@throws(MyException)设置的属性,而add2将有@throws().这是因为add2抓可从集合删除所有代码路径中的异常.

虽然throws属性支持且确实会验证,但它非常宽松,不应影响现有代码.

必须复制而不是移动基于结构的异常,这是指成员数据引用计数内存完整性期望复制构造器和析构器.对内存一致性,不必要的调用,不会阻止优化.

语法

AtAtribute:
...
    + @ throws
    + @ throws ( ThrowsArgumentList|opt )
+ ThrowsArgumentList:
    + Type
    + Type ,
    + Type , ThrowsArgumentList
TraitsExpression:
    + getThrowSet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

属性

添加了一个新属性,而@throws带可选的参数列表.参数列表值的计算结果,必须为从Throwable继承的类或结构.

所有不带参数列表@throws属性的函数,都默认为推导属性值.nothrow属性等效于@throws(),并且按用户编写了新属性对待.

无论是哪种属性,推导按语义的一部分分析.如果已设置属性不等价,则编译器将出错.这算程序员错误.

等价检查隐式转换类型限定符,且在基于类的机制中与父类子类都相关.即,如果在属性列表中设置了Throwable,则在匹配Exception时触发Exception.

如果未提供函数体,类或接口虚方法,则按@throws(Exception)推导,这与当前行为匹配,并计划按错误行为删除它.

要获得抛集,可用__traits(getThrowSet,symbol)特征,可用它来生成try catch语句,以从抛集中删除类型.

@throws属性中,提供异常类型而不抛,不算错误.

Try Catch

@throws属性是个集合.通过触发和抓异常来添加或删除值.

如果试抓未在抛集中表示的异常,则应发出警告.这可能是不必要的路径,或更差,一条未记录的路径.
如果使用条件编译(CTFE生成的代码或版本)并收到此警告,则应用所有可能异常显式设置抛集,而不是依赖推导.

,如果在抛集中表示了个异常,但它不是父级等于项,则不能删除项.因为可能有仍可能抛的未知子.

使用推导,添加从集合删除异常的示例.

int toCall() /*@throws(MyException)*/ {
    throw new MyException;
}
int caller() /*@throws()*/ {
    int result;
    try {
        result = toCall();
    } catch(MyException) {
        result = 0xDEADBEEF;
    }
    return result;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

抓所有异常并不是个已解决的问题,但未来可用模式匹配解决.

机制

DIP引入了一个新的利用了新的@throws属性来抓异常的机制.

所有D函数返回类型都有非空抛集,且有等价于标签联结构成员.但是,与普通标签联不同,标签值不基于可能选项列表中的偏移.

相反,应该基于一个,编译器可基于与使用位置无关如全名哈希值符号生成的整数值.

如果非extern(D)函数,在推导中设置的抛集中有其成员,且在抛集中有结构成员错误.这是因为修改其他语言无法表示的函数签名.

新机制不需要更改语法,基于类的异常可能会重写其实现以利用它,而不需要运行时库抛和抓.

结构,该机制与三个成员相关.两个识别抛位置.第三个用作标签联的标签值,并考虑结构的非零大小,并允许取用来标识类型的标签.

位置成员lastThroworiginalThrow.如果已按非null设置originalThrow成员,且正在抛它,则相反设置lastThrow成员.

即,如果生成栈跟踪,则最多仅包含两个函数调用.不能来在原始抛上次抓的位置间创建全栈跟踪.这些成员设置为在ROM中存储的并应包含全限定模块名和行号的串.如,"my.mod.ule:102".

标签值使用tag的成员名.它必须是uintulong,且是第一个字段.此字段的目的是在复制调用栈时,允许结构有效地为零大小.

最初可能是无用的,但它确实有优化潜力.对未抓值类型异常,这样无需检查重抛数据,可用单个else块来重抛,不需要调用复制构造器,析构器或后复制的东西.

如果函数中未抓值类型异常,则在调用者函数中,编译器会自动重抛它,但(如果有)不会更改lastThrow成员.

该机制应该尽量便宜,它是为了在抛异常的附近.一般由库作者使用,除非资源受限,否则不适合应用作者.

它不需要堆分配,且必须保证在调用栈中清理函数区间内的变量.

破坏性变更和弃用

建议弃用nothrow关键字,以支持@throws()语法,因为它是等效的.
建议弃用throw属性,以支持@throws(Exception)语法,因为它是等效的.
两年后,所有类上,默认推导@throws(Exception),删除并弃用,接口虚方法和函数指针.该错误的行为是为了避免初始代码破坏,并允许延迟到更新其代码基为止.
对调用抛的UDA用户,可能是个重大更改,因为应该禁止它.
Herb Sutter的抛值
抓值
C++异常及替代

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/111235
推荐阅读
  

闽ICP备14008679号