错误处理 - 浏览器环境

当 JavaScript 运行时错误(包括语法错误)发生时,window会触发一个ErrorEventopen in new window接口的error事件,并执行window.onerror()

错误处理方式

window.onerror

window.onerror = function(
    message,
    source,
    lineno,
    colno,
    error
) {
    // ...
}
1
2
3
4
5
6
7
8
9
  • message:错误信息(字符串)。可用于HTML onerror=""处理程序中的event。
  • source:发生错误的脚本URL(字符串)
  • lineno:发生错误的行号(数字)
  • colno:发生错误的列号(数字)
  • error:Error对象(对象)

若该函数返回true,则阻止执行默认事件处理函数。

window.addEventListener('error')

window.addEventListener('error', function(event) { ... })
1

ErrorEventopen in new window类型的event包含有关事件和错误的所有信息。

element.onerror

element.onerror使用单一Eventopen in new window参数的函数作为其处理函数。

注意事项

当加载自不同域open in new window的脚本中发生语法错误时,为避免信息泄露(参见bug 363897open in new window),语法错误的细节将不会报告,而代之简单的"Script error."。在某些浏览器中,通过在<script>使用crossorigin属性并要求服务器发送适当的 CORS HTTP 响应头,该行为可被覆盖。一个变通方案是单独处理"Script error.",告知错误详情仅能通过浏览器控制台查看,无法通过 JavaScript 访问。

window.onerror = function (msg, url, lineNo, columnNo, error) {
    var string = msg.toLowerCase();
    var substring = "script error";
    if (string.indexOf(substring) > -1){
        alert('Script Error: See Browser Console for Detail');
    } else {
        var message = [
            'Message: ' + msg,
            'URL: ' + url,
            'Line: ' + lineNo,
            'Column: ' + columnNo,
            'Error object: ' + JSON.stringify(error)
        ].join(' - ');

        alert(message);
    }

    return false;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

当使用行内HTML标签(<body onerror="alert('an error occurred')">)时,HTML规范要求传递给onerror的参数命名为eventsourcelinenocolnoerror。针对不满足此要求的浏览器,传递的参数仍可使用arguments[0]arguments[2]来获取。

Reference