网站的javascript中未处理的异常会如何处理?

时间:2019-05-23 05:20:24

标签: javascript

我最近发生了一个异常,直到我看了chrome dev tools console才注意到。

网站的javascript是否只是在更高级别的某个地方处理和记录异常?我没有在下面的function1中处理异常,因此以后的功能只是没有运行或发生了什么。

发生异常时到底会发生什么?我已经习惯了未处理的异常,这意味着程序只会停止

containingFunction
{
   function1();
   function2()
   function3()
   return;
}

2 个答案:

答案 0 :(得分:4)

TLDR

如果未捕获到异常,并且允许其冒泡至全局范围,则javascript引擎将仅停止处理任何内容。

所以这不简单:

  

后来的功能只是没有被运行

下面的任何代码都不会运行。不管它们是否是函数,if语句,循环等。

但是..事件不断发生?

嗯..这取决于。

更具体地说,浏览器停止当前执行的脚本(1),然后输入event loop。这意味着,任何以前设法在异常发生之前安排事件的先前代码都将执行该将来的回调。

例如,以下代码:

<html>
<head>
  <script>
    setTimeout(() => console.log("ha"),1000);

    throw new Error("oops");

    console.log("ho");
  </script>
</head>
<body>
</body>
</html>

或者,如果您更习惯查看基于promise的代码:

<html>
<head>
  <script>
    Promise.resolve().then(()=>console.log("ha"));

    throw new Error("oops");

    console.log("ho");
  </script>
</head>
<body>
</body>
</html>

都会抛出一个错误并打印“ ha”,但将打印“ ho”。

但这取决于解释器。上面的内容适用于浏览器,但不适用于node.js。 Node会在出现任何未捕获的错误时退出该过程。

例如代码:

setTimeout(() => console.log("ha"),1000);

throw new Error("oops");

console.log("ho");

或者,如果您更习惯查看基于promise的代码:

Promise.resolve().then(()=>console.log("ha"));

throw new Error("oops");

console.log("ho");

与节点一起执行时,不会打印“ ha”或“ ho”。

  

(1)-“脚本”是指您作为Web开发人员编写的脚本。当然,我并不是说浏览器开发人员编写的任何代码。

答案 1 :(得分:1)

构造页面时,可以将JavaScript放在标题标签中或页面(or anywhere in between for that matter)的底部。有些浏览器仅在HTML和CSS加载后才执行JavaScript,有些浏览器在加载JavaScript时运行JavaScript。

很多人的html布局如下:

<html>
<header>
    <title></title>

    <!--Styles-->
    <!--End Styles-->
</header>
<body>
    <!--All content-->

    <!--End All content-->

    <!--Scripts-->
    <!--End Scripts-->
</body>

原因是JavaScript不会延迟页面加载速度,如果页面中断,则大多数页面已经加载/呈现。如果JavaScript在没有try { } catch(err) { }的情况下中断,则其余部分将不会执行,但不会在页面上引发错误,因此开发人员工具中存在控制台的原因(大多数浏览器都具有此功能)

Read more here on w3schools.com

JavaScript尝试捕获:

try {
    //Do your work here
} catch(err) {
    console.log(err.message);
}