JavaScript 是一种动态语言,这意味着代码中可能存在一些错误,因为它无法在编译时发现它们。然而,使用 try{} catch{} 块可以帮助我们在代码中处理异常。新的 ES12 标准引入了一些新的功能来增强 try {…} catch(e){} 块的功能,帮助您更好地处理错误。
try {…} catch(e){} 的标准用法
首先,让我们回顾一下 try {…} catch(e){} 块的常规用法。这个结构包含了两个部分:
- try 代码块是您需要包含代码的地方,可能会导致异常情况。
- catch 代码块是您可以在其中处理异常的地方。
语法如下:
try { // 可能会导致异常的代码 } catch (e) { // 处理异常的代码 } finally { // 可选 – 不管发生了什么,这个代码总是执行 }
catch 块可以省略,但 try 块始终需要。如果您只需要在 try 块中执行代码,并不需要处理任何异常情况,那么您可以省略 catch 块。
“finally” 代码块是可选的。如果指定,则在 try 或 catch 中发生异常引发的异常对象被处理后该代码块始终会执行。这是一个很好的地方,您可以在其中释放资源或完成其他清理任务。
新的 try {…} catch(e){} 功能
ES12 引入了一些新的 try {…} catch(e){} 功能来增强其功能。现在,我们可以一起探讨这些新的功能。
1. “try .. catch”支持执行块
ES12 标准提供了 try-catch 语法的一个新特性,即 catch 子句可用于执行代码块。它可以用作一个更具可读性的语法结构,而不需要创建临时变量来引用错误。
语法如下:
try/catch { // 可能会导致异常的代码 } catch (e) { // 处理异常的代码 }
更好的例子:
try { undefinedVariable; } catch { console.log("错误:变量未定义!") }
通过这种方式,您可以使代码更加可读和易于维护,因为错误处理逻辑直接嵌入到 try-catch 结构中。
2. Error 对象支持堆栈追踪增强
ES12 提供了改进的堆栈跟踪,这样您就可以更容易地找到 causingException 。causingException 会告诉您繁忙的堆栈中最初发生错误的地方。
语法如下:
try { username = people.username; } catch (error) { console.error('Caused by:', error.causingException); }
在这种情况下,当异常进入 catch 块时,error 包含 Exception,CausingException 和 stackTrace 属性。
3. try {…} catch(e){} 现在支持列表推导式
ES12 中的 try-catch 语法现在支持列表推导式,这意味着错误处理代码块现在可以处理一个列表中的值,而不仅仅是单个值。
语法如下:
try { // 可能会导致异常的代码 } catch (err) if (err instanceof TypeError) { // 处理 TypeError 的代码 } catch (err) if (err instanceof SyntaxError) { // 处理 SyntaxError 的代码 }
在这样的情况下,catch 子句还包括一个 if 子句,以对错误进行判断,以便选择正确的异常处理块。
组合使用
您还可以将之前列出的这些特性合并在一起。例如:
// javascriptcn.com 代码示例 try/catch { throw TypeError("类型错误!"); } catch (e) if (e instanceof TypeError) { console.log("已捕获 TypeError:", e.causingException) } catch { console.log("已捕获错误:", e); } finally { console.log("已出现异常!"); }
在这个示例中,我们首先抛出一个类型错误。我们捕获它,如果是一个类型错误,则打印 causingException(堆栈跟踪),否则打印错误本身。最后,不管发生了什么,finally 块总是执行。
总结:
ES12 对 try {…} catch(e){} 添加了一些新的功能和语法,这可以使您的代码更加易于阅读、便于维护并更加强大。堆栈跟踪的修正让错误处理变得更加容易。支持执行块和列表推导式让代码更易懂和可读。因此,使用这些新的特性能帮助您更好地处理异常,并改进您的代码的质量。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652f4c307d4982a6eb064538