在 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
}