d异常链下个方法
import std.stdio;
import std.exception;
private:
class E1 : Exception { mixin basicExceptionCtors; }
class E2 : Exception { mixin basicExceptionCtors; }
void foo ()
{
try throw new E1 ("e1");
catch (Exception e)
throw new E2 ("e2");
}
void bar ()
{
auto e = new E1 ("e1");
e.next = new E2 ("e2");
throw e;
}
void dumpall (Exception e)
{
Throwable t = e;
stderr.writeln ("dumpall");
do
stderr.writeln (t.msg);
while ((t = t.next) !is null); // XXX: 为何!!(t = t.next)不编译?
}
public void main ()
{
try foo ();
catch (Exception e)
dumpall (e);
try bar ();
catch (Exception e)
dumpall (e);
}
//输出:
$ dmd cetest
$ ./cetest
dumpall
e2
dumpall
e1
e2
这两种情况下都会出现两个
链式异常.是否允许
从用户
代码中附加异常
?
在scope(exit)
清理代码中,自动绑定异常.scope(failure)
还有点漏洞.
import std.stdio;
void foo() {
// 漏洞? scope(failure)也应该一样.
scope (exit) {
bar();
}
throw new Exception("from foo");
}
void bar() {
throw new Exception("from bar");
}
void main() {
try {
foo();
} catch (Exception exc) {
for (Throwable e = exc; e; e = e.next) {
writeln(e.msg);
}
}
}
//输出:
from foo
from bar
也可用chainTogether
.
try {
foo();
} catch (Throwable exc) {
Throwable.chainTogether(exc, new Exception(" ... "));
throw exc;
}
准确地说,在"finally"
块内抛出异常
会链接到前一个异常
,但在"catch"
块内抛出异常不会.scope(exit)
和scope(failure)
分别只是"finally"
和"catch"
的语法糖.
因此,一旦抓到异常,链
就会结束,之后抛出异常
会开始新链
.
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现