【问题标题】:JavaScript: Catch not hit on "Uncaught SyntaxError" [Chrome]JavaScript:捕获未命中“未捕获的语法错误”[Chrome]
【发布时间】:2011-06-30 14:04:28
【问题描述】:

有人可以向我解释为什么 try/catch 不能处理“Uncaught SyntaxError”吗?是否可以优雅地处理这种类型的错误,以便其余的 JS 运行?

例如:

try { response.write(;); }
catch(e) { console.log(e); }

此代码抛出“未捕获的语法错误:意外的令牌;” [Chrome] 浏览器错误,而不是跳转到 catch 并记录错误对象。您在 Firefox 中也会得到类似的结果;抛出的错误,而不是用 catch 处理它。

【问题讨论】:

    标签: javascript error-handling console try-catch syntax-error


    【解决方案1】:

    语法错误不是运行时异常。为了让您的程序能够抛出和捕获异常,它需要能够运行。为了运行,它需要是 javascript。上面的示例不是有效的 javascript。解释器在看到第一个无效行时放弃并打印错误,甚至从未到达“catch”行。

    【讨论】:

    • 为了捕捉在脚本模块中使用 appendChild 时发生的错误,我使用了一个临时的 window.onerror 监听器,我将它封装在一个 Promise 中。
    【解决方案2】:

    好吧,由于这是一个语法异常,这意味着 javascript 解析器无法解析您的代码。由于浏览器无法解析您的代码,因此无法执行。它甚至不知道你的 try/catch 块。 try/catch 块只能捕获由于在块上下文中执行代码而引发的异常。

    【讨论】:

    • 精彩的解释。我希望有人能在我学习 JS 时向我解释这一点。
    【解决方案3】:

    您可以为此使用解决方法。

    try {
        Function('response.write(;);')
    } catch(e) {
        console.log(e);
    }
    

    可以用这种方式确定es6 template string support

    var isEs6Template;
    try {
        Function('``');
        isEs6Template = true;
    } catch(e) {
        isEs6Template = false;
    }
    
    console.log('es6 template is', isEs6Template ? 'supported' : 'unsupported');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2016-10-18
      • 2020-07-02
      相关资源
      最近更新 更多