在 Rhino 中捕获未处理的异常
Catching unhandled exceptions in Rhino
我正在使用 Rhino 脚本引擎,想知道是否有可能(以及如何)注册一个全局处理程序,只要触发未处理的异常就可以调用它。
我知道我不能使用像 window
这样的浏览器对象来注册处理程序:
window.addEventListener("error", function (e) {
alert("Error occurred: " + e.error.message);
return false;
})
有其他选择吗?
取决于完全您想要什么——以及您拥有什么——这是一种方法:
var setUncaughtExceptionHandler = function(f) {
Packages.org.mozilla.javascript.Context.getCurrentContext().setErrorReporter(
new JavaAdapter(
Packages.org.mozilla.javascript.ErrorReporter,
new function() {
var handle = function(type) {
return function(message,sourceName,line,lineSource,lineOffset) {
f({
type: type,
message: String(message),
sourceName: String(sourceName),
line: line,
lineSource: String(lineSource),
lineOffset: lineOffset
});
};
};
["warning","error","runtimeError"].forEach(function(name) {
this[name] = handle(name);
},this);
}
)
);
};
setUncaughtExceptionHandler(function(error) {
Packages.java.lang.System.err.println("Caught exception: " + JSON.stringify(error,void(0)," "));
});
var x = true;
var y = null;
var z = y.foo;
这个输出是:
Caught exception: {
"type": "error",
"message": "uncaught JavaScript runtime exception: TypeError: Cannot read property \"foo\" from null",
"sourceName": "null",
"line": 0,
"lineSource": "null",
"lineOffset": 0
}
我正在使用 Rhino 脚本引擎,想知道是否有可能(以及如何)注册一个全局处理程序,只要触发未处理的异常就可以调用它。
我知道我不能使用像 window
这样的浏览器对象来注册处理程序:
window.addEventListener("error", function (e) {
alert("Error occurred: " + e.error.message);
return false;
})
有其他选择吗?
取决于完全您想要什么——以及您拥有什么——这是一种方法:
var setUncaughtExceptionHandler = function(f) {
Packages.org.mozilla.javascript.Context.getCurrentContext().setErrorReporter(
new JavaAdapter(
Packages.org.mozilla.javascript.ErrorReporter,
new function() {
var handle = function(type) {
return function(message,sourceName,line,lineSource,lineOffset) {
f({
type: type,
message: String(message),
sourceName: String(sourceName),
line: line,
lineSource: String(lineSource),
lineOffset: lineOffset
});
};
};
["warning","error","runtimeError"].forEach(function(name) {
this[name] = handle(name);
},this);
}
)
);
};
setUncaughtExceptionHandler(function(error) {
Packages.java.lang.System.err.println("Caught exception: " + JSON.stringify(error,void(0)," "));
});
var x = true;
var y = null;
var z = y.foo;
这个输出是:
Caught exception: {
"type": "error",
"message": "uncaught JavaScript runtime exception: TypeError: Cannot read property \"foo\" from null",
"sourceName": "null",
"line": 0,
"lineSource": "null",
"lineOffset": 0
}