【问题标题】:Catching a custom javascript exception with window.onerror - in IE在 IE 中使用 window.onerror 捕获自定义 javascript 异常
【发布时间】:2010-12-18 00:28:20
【问题描述】:

我有一个用于特定情况的自定义异常类。它可以从任何地方抛出,所以 try/catch 并不实用。

throw new CustomException;

我想在 window.onerror 中捕获这个错误并将其过滤掉,这在我迄今为止测试过的大多数浏览器中都可以正常工作。

var window_onerror = window.onerror || function() {return false;};
window.onerror = function(message, url, line)  {
  if (message.match(CustomException.prototype.name)) {
    return true;
  } else {
    return window_onerror(message, url, line);
  }
};

但是,在 IE 中,window.onerror 函数接收到 Exception thrown and not caught 而不是我的自定义异常。

【问题讨论】:

    标签: javascript internet-explorer exception


    【解决方案1】:

    我不知道有什么方法可以在onerror 处理程序中检索抛出的对象。作为一种解决方法,我建议使用自定义消息引发通用运行时错误,即

    throw new Error('foo')
    

    然后检查

    message === 'foo'
    

    在处理函数内部。

    编辑:工作示例代码:

    window.onerror = function(message, url, line)  {
        alert(message === 'foo');
        return true;
    };
    
    throw new Error('foo');
    

    【讨论】:

    • 我承认它在 IE 中工作,(这是我问的),但 Firefox 仅使用该技术报告 Script Error
    • bitbucket.org/JustinLove/module/src/4f80d66afb94 见 script/cgd/Module.js 在 qunit/index.html 中测试 抛出在第 126 行,异常定义和处理程序从 196 开始。
    【解决方案2】:

    我们有一个通用的异常处理程序,我们在 Exceptioneer.com 上使用它,但是每个浏览器的行为不同,并以不同的方式报告相同的异常。

    此外,不同的本地化版本的浏览器会以不同的方式运行,例如,我看到我们的一些用户的俄语 Javascript 错误 - 这不是世界上最容易解析的东西。

    此脚本将让您了解不同的浏览器如何处理错误:-

    window.onerror = function(message, uri, line) {
        var fullMessage = location.href + '\n' + uri + '\n' + line;
        alert(fullMessage);
        return false;
    }
    

    谢谢,

    菲尔。

    【讨论】:

    • 你不应该在fullMessage 变量中也包含message 吗?
    【解决方案3】:

    声明一个全局变量和一些枚举..

    var errorCode;
    const ErrCustomException = 1, ... ;
    

    在你的抛出异常前加一行..

    errorCode = ErrCustomException;
    throw new CustomException;
    

    把条件改成这个..

    window.onerror = function(message, url, line)  {
      if (errorCode == ErrCustomException) {
        return true;
      } else {
        return window_onerror(message, url, line);
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多