d的异常2
原文
添加环境信息
到可能无法访问
传播异常的抛代码
中.
是的,但可再次这样:抓一个,然后抛新的,并把旧的放在后面.
是的.但是,必须在每个可能想要添加环境信息
的潜在抽象级别
周围插入try/catch
语法很痛苦.如果在战略入口点
,用可插入的包装器
,就更好了.如下?
// 幻想的,假设的语法
auto myFunc(Args...)(Args args) {
int additionalInfo = 123;
scope(failure, additionalInfo);
return runUnreliableOperation(args);
}
域共享析构器
,可以这样:
struct AdditionalInfo {
static string[] info;
this(string info) {
AdditionalInfo.info ~= info;
}
~this() {
AdditionalInfo.info = AdditionalInfo.info[0 .. $ - 1];
}
@disable this(this);
}
class AdditionalInfoException : Exception {
this(string t) {
import std.string;
super(t ~ "\n" ~ AdditionalInfo.info.join(" "));
}
}
void bar() {
with(AdditionalInfo("zone 1")) {
with(AdditionalInfo("zone 2")) {
}
throw new AdditionalInfoException("info");
}
}
void main() {
bar();
}
抛出点
需要与之合作,但仍然可以试/抓
整个操作,并附加原始异常
到新异常中.最大的问题仍然是串类型
,呃.
通过编译器,可在异常处理
的元数据
中附加函数级别
信息,因此就像生成栈跟踪
一样查找
它.但仅限于函数级.但是,有嵌套
函数.