在 BuckleScript(现更名为 ReScript)中处理异常堆栈跟踪涉及以下几个关键概念和解决方案:
exception
关键字定义自定义异常raise
抛出异常try/catch
模式(编译为JS的try-catch)[@bs.stack_trace]
属性[@bs.stack_trace]
let riskyOperation = () => {
raise(Not_found)
};
在 bsconfig.json
中添加:
{
"flags": ["-bs-super-errors"]
}
exception DatabaseError(string);
let queryDatabase = () => {
// 模拟错误
raise(DatabaseError("Connection timeout"));
};
[@bs.stack_trace]
let main = () => {
try {
queryDatabase();
} {
| DatabaseError(msg) =>
Js.log2("Caught DB error:", msg);
Js.log(Js.Stack.current()); // 打印当前堆栈
| _ =>
Js.log("Unknown error");
};
};
main();
原因:
解决方案:
{
"flags": ["-bs-no-inline"]
}
external toJsExn: exn => Js.Exn.t = "%identity";
try {
riskyOperation()
} catch (jsExn) {
let stack = Js.Exn.stack(jsExn);
Js.log2("Full JS stack:", stack);
}
exception NetworkError({
url: string,
status: int,
innerExn: option<exn>
});
let asyncOp = () => {
Js.Promise.make((resolve, reject) => {
reject(Js.Exn.raiseError("Async failure"))
});
};
asyncOp()
->Js.Promise.catch(err => {
Js.log2("Async error stack:", Js.Exn.stack(err));
Js.Promise.resolve();
});
以上方案适用于 ReScript v9+ 版本,较旧版本可能需要使用 [@bs.debug]
属性替代部分功能。