是否必须将throw语句包含在try / catch块中?

时间:2018-09-24 08:05:13

标签: javascript error-handling try-catch microsoft-edge throw

我试图在网站上搜索此问题,但没有任何反应回答我的具体疑问。

我的应用程序函数中有一个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,并且在捕获中重新出现。在这种情况下,错误仍然会触发。

1 个答案:

答案 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中的输出:

enter image description here