代码之家  ›  专栏  ›  技术社区  ›  bachr

在rhino中捕获未处理的异常

  •  0
  • bachr  · 技术社区  · 6 年前

    我正在使用RHIO脚本引擎,想知道是否有可能(以及如何)注册一个可以在未处理异常被触发时调用的全局处理程序。

    我知道我不能使用浏览器对象 window 用一个类似的方法注册一个处理程序:

    window.addEventListener("error", function (e) {
      alert("Error occurred: " + e.error.message);
      return false;
    })
    

    有别的选择吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   David P. Caldwell    6 年前

    依靠 确切地 你想要什么——你拥有什么——这里有一种方法:

    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
    }