我最近发生了一个异常,直到我查看 chrome 开发工具控制台时才注意到。
网站的 javascript 是否只是在某个更高级别处理和记录异常?我没有处理下面 function1 中的异常,所以后面的函数只是没有运行或什么的。
发生异常时究竟会发生什么?我习惯了一个未处理的异常意味着程序刚刚停止
containingFunction
{
function1();
function2()
function3()
return;
}
Run Code Online (Sandbox Code Playgroud)
如果异常没有被捕获并被允许冒泡到全局范围,那么 javascript 引擎将简单地停止处理任何事情。
所以它不是简单的:
后来的功能只是没有运行或什么的
任何低于异常的代码都不会运行。不管它们是函数、if语句、循环等。
这要看情况。
更具体地说,浏览器停止当前执行的脚本(1) 并进入事件循环。这意味着任何在异常之前设法在未来安排事件的先前代码都将执行该未来回调。
例如,以下代码:
<html>
<head>
<script>
setTimeout(() => console.log("ha"),1000);
throw new Error("oops");
console.log("ho");
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
或者,如果您更习惯于查看基于 Promise 的代码:
<html>
<head>
<script>
Promise.resolve().then(()=>console.log("ha"));
throw new Error("oops");
console.log("ho");
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
都会抛出错误并打印“ha”但不会打印“ho”。
但这取决于解释器。以上适用于浏览器,但不适用于 node.js。Node 只是在遇到任何未捕获的错误时退出进程。
例如代码:
setTimeout(() => console.log("ha"),1000);
throw new Error("oops");
console.log("ho");
Run Code Online (Sandbox Code Playgroud)
或者,如果您更习惯于查看基于 Promise 的代码:
Promise.resolve().then(()=>console.log("ha"));
throw new Error("oops");
console.log("ho");
Run Code Online (Sandbox Code Playgroud)
会不会当节点执行打印“哈”,也不是“豪”。
(1) - “脚本”是指您作为 Web 开发人员编写的脚本。当然,我指的不是浏览器开发人员编写的任何代码。
小智 1
当您构建页面时,您可以将 JavaScript 放置在标头标记中或页面底部(or anywhere in between for that matter)。有些浏览器仅在加载 HTML 和 CSS 后才执行 JavaScript,有些浏览器在加载时运行 JavaScript。
很多人的html布局是这样的:
<html>
<header>
<title></title>
<!--Styles-->
<!--End Styles-->
</header>
<body>
<!--All content-->
<!--End All content-->
<!--Scripts-->
<!--End Scripts-->
</body>
Run Code Online (Sandbox Code Playgroud)
原因是 JavaScript 不会延迟页面加载速度,如果它中断,大部分页面已经加载/渲染。当 JavaScript 在没有 的情况下中断时try { } catch(err) { },其余部分将不会被执行,但它不会在页面上引发错误,这就是为什么控制台存在于开发人员工具中的原因(大多数浏览器都有此功能)
JavaScript 尝试捕获:
try {
//Do your work here
} catch(err) {
console.log(err.message);
}
Run Code Online (Sandbox Code Playgroud)