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();
}
抛出点需要与之合作,但仍然可以试/抓整个操作,并附加原始异常到新异常中.最大的问题仍然是串类型,呃.
通过编译器,可在异常处理的元数据中附加函数级别信息,因此就像生成栈跟踪一样查找它.但仅限于函数级.但是,有嵌套函数.
浙公网安备 33010602011771号