我试图在网站上搜索此问题,但没有任何反应回答我的具体疑问。
我的应用程序函数中有一个throw语句,如果应用程序所需的核心元素不存在,则会引发引用错误并终止程序的执行。
示例代码:
let element = document.querySelector('.app');
if (!element) {
throw new ReferenceError("Main app element doesn't exist")
}
好吧,在查看我的错误捕获应用程序的错误日志时,我注意到存在一个错误率较低的错误,该错误指向此代码的包装函数。此错误仅在Microsoft Edge上发生,并说出下一条语句:
引发异常但未捕获
阅读Microsoft docs后,我明白了:
引发并没有捕获到异常
您在代码中包含了throw语句,但未将其包含在try块中,或者没有关联的catch块来捕获错误。使用throw语句从try块内引发异常,并使用catch语句将异常捕获在try块外。
更正此错误
将可能引发异常的代码包含在try块中,并确保存在相应的catch块。
确保您的catch语句期望正确的异常形式。
如果引发异常,请确保还有另一个对应的catch语句。
我是否需要按照Microsoft的保证,将throw
语句括在try/catch
块中? (此错误不会被其他任何浏览器抛出,我一直认为该错误处理是可选的)
如果答案是肯定的,是否需要将catch
语句留空?如果没有,如果我尝试重新引发该错误,则MS Edge
会说该语句未包含在try / catch
中(正如他们在第三点中所建议的那样)。
let element = document.querySelector('.app');
if (!element) {
try {
throw new ReferenceError("Main app element doesn't exists")
} catch (e) {
// Empty or re-trow?
}
}
更新:
我做了this jsfiddle,而MS Edge
没有显示错误。考虑到我的日志中的user agent
,看来它是Edge
:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
但是也许我的错误处理应用程序中的信息不可靠。
如果您可以在某些浏览器中重现该错误,请告诉我。
更新2:
实际上,错误是在MS Edge
中引发的,如果错误以String
引发则不会发生:
throw "Main app element doesn't exist";
但是如果it does occur是使用ReferenceError object(或与Error
不同的任何其他错误对象)引发的错误,则为
throw new ReferenceError("Main app element doesn't exist")
更新3:
这里是another jsfiddle,其中有一个try / catch
,并且在捕获中重新出现。在这种情况下,错误仍然会触发。
答案 0 :(得分:0)
当您在那时使用带有新参考错误的throw与对象时,您需要使用try ... catch。如果将错误作为字符串传递,则无需使用try ... catch。
请参阅下面的示例。
<!Doctype html>
<head>
<script>
function getElement () {
let el = document.querySelector('.myElement');
if (!el) {
try{
throw new ReferenceError("Main app element doesn't exists");
}
catch(e)
{
console.log(e.message);
}
}
}
getElement();
</script>
</head>
<body>
</body>
</html>
Edge中的输出: