d异常隐藏断定
但是,不是更重要的AssertError
,而是抛可怜
的异常:
import std.string;
void foo(int i) {
//此时,遗忘了`%s`,但它可能是其他小错误.
assert(i == 42, format("Bad parameter:", i));
}
void main() {
foo(43);
}
用编译时格式串:
assert(myAssumption,format!"%s不工作!"(aa));
最简单方法是让assert(condition, message)
先计算消息,以便Ali
的示例等价于:
import std.format;
void foo(int i) {
auto __msg = format("坏参数", i);
assert(i == 42, __msg);
}
void main() {
foo(43);
}
这样,如果抛消息式
,则永远不会计算断定
条件,且程序不会进入无效状态
.
不.更改
求值顺序会产生深远的影响:
1,先求值
消息,副作用可能会改变断定条件
的结果.
2,不希望无条件地计算可能昂贵的消息
式,即包括断定
成立的普通情况.
3,消息
式可能依赖
失败条件后状态.如恐怖的:
assert(x.trySomething(), x.getLastErrorMsg())
也可这样:
import std.exception : assumeWontThrow;
assert(condition, assumeWontThrow(可能抛式));
它清楚地记录了消息表达式
可能抛出的内容.这样,消息
表达式引发的异常,不会隐藏错误.
或者创建包装器:
string assertFormat(Args...)(string fmt, Args args)
{
try {
return format(fmt, args);
} catch(Exception ex) {
return "求值错误" ~ ex.toString;
}
}
// 用法:
assert(i == 42, assertFormat("Something %s", functionThatThrows()));
这应该是最佳实践.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现