深入了解语句try...catch的基础知识和应用 - Web前端
作者:98wpeu发布时间:2026-09-09分类:网页前端技术浏览:3

2020还剩最后两天了,新的2021要到来了。今天带大家一起复习下JS的基础知识,深入了解语句try...catch的应用。
try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
先来看个例子:
try {
nonExistentfunction();
} catch (error) {
console.error(error);
// expected output: referenceError: nonExistentFunction is not defined
// Note - error messages will vary depending on browser
}大家可以试试,运行会提示什么结果?
> ReferenceError: nonExistentFunction is not defined
您是否答对了呢,如果答错也没关系,我们接下来详细了解下try...catch语句。
语法
try {
try_statements
}
[catch (exception_var_1 if condition_1) { // non-standard
catch_statements_1
}]
...
[catch (exception_var_2) {
catch_statements_2
}]
[finally {
finally_statements
}]try_statements需要被执行的语句。
catch_statements_1,catch_statements_2如果在
try块里有异常被抛出时执行的语句。
exception_var_1,exception_var_2用于保存关联
catch子句的异常对象的标识符。
condition_1一个条件表达式。
finally_statements在
try语句块之后执行的语句块。无论是否有异常抛出或捕获这些语句都将执行。
描述
try语句包含了由一个或者多个语句组成的try块, 和至少一个catch块或者一个finally块的其中一个,或者两个兼有, 下面是三种形式的try声明:
try...catchtry...finallytry...catch...finally
catch子句包含try块中抛出异常时要执行的语句。也就是,你想让try语句中的内容成功, 如果没成功,你想控制接下来发生的事情,这时你可以在catch语句中实现。 如果在try块中有任何一个语句(或者从try块中调用的函数)抛出异常,控制立即转向catch子句。如果在try块中没有异常抛出,会跳过catch子句。
finally子句在try块和catch块之后执行但是在下一个try声明之前执行。无论是否有异常抛出或捕获它总是执行。
你可以嵌套一个或者更多的try语句。如果内部的try语句没有catch子句,那么将会进入包裹它的try语句的catch子句。
你也可以用try语句去处理 javascript 异常。参考JavaScript 指南了解更多关于 Javascript 异常的信息。
无条件的catch块
当使用单个无条件catch子句时,抛出的任何异常时都会进入到catch块。例如,当在下面的代码中发生异常时,控制转移到catch子句。
try {
throw "myException"; // generates an exception
}
catch (e) {
// statements to handle any exceptions
logMyErrors(e); // pass exception Object to error handler
}catch块指定一个标识符(在上面的示例中为e),该标识符保存由throw语句指定的值。catch块是唯一的,因为当输入catch块时,javascript 会创建此标识符,并将其添加到当前作用域;标识符仅在catch块执行时存在;catch块执行完成后,标识符不再可用。
条件catch块
非标准
该特性是非标准的,请尽量不要在生产环境中使用它!
你也可以用一个或者更多条件catch子句来处理特定的异常。在这种情况下,当异常抛出时将会进入合适的catch子句中。在下面的代码中,try块的代码可能会抛出三种异常:typeError,RangeError和EvalError。当一个异常抛出时,控制将会进入与其对应的catch语句。如果这个异常不是特定的,那么控制将转移到无条件catch子句。
当用一个无条件catch子句和一个或多个条件语句时,无条件catch子句必须放在最后。否则当到达条件语句之前所有的异常将会被非条件语句拦截。
提醒:这个功能不符合 ECMAScript 规范。
try {
myroutine(); // may throw three types of exceptions
} catch (e if e instanceof TypeError) {
// statements to handle TypeError exceptions
} catch (e if e instanceof RangeError) {
// statements to handle RangeError exceptions
} catch (e if e instanceof EvalError) {
// statements to handle EvalError exceptions
} catch (e) {
// statements to handle any unspecified exceptions
logMyErrors(e); // pass exception object to error handler
}下面用符合 ECMAscript 规范的简单的 javaScript 来编写相同的“条件catch子句”(显然更加冗长的,但是可以在任何地方运行):
try {
myRoutine();
} catch (e) {
if (e instanceof RangeError) {
// statements to handle this very common expected error
} else {
throw e; // re-throw the error unchanged
}
}异常标识符
当try块中的抛出一个异常时, exception_var(如catch (e)中的e)用来保存被抛出声明指定的值。你可以用这个标识符来获取关于被抛出异常的信息。
这个标识符是catch子语句内部的。换言之,当进入catch子语句时标识符创建,catch子语句执行完毕后,这个标识符将不再可用。
function isValidjson(text) {
try {
JSON.parse(text);
return true;
} catch {
return false;
}
}finally块
finally块包含的语句在try块和catch之后,try..catch..finally块后的语句之前执行。请注意,无论是否抛出异常finally子句都会执行。此外,如果抛出异常,即使没有catch子句处理异常,finally子句中的语句也会执行。
以下示例打开一个文件,然后执行使用该文件的语句(服务器端 JavaScript 允许您访问文件)。如果文件打开时抛出异常,则finally子句会在脚本失败之前关闭该文件。finally中的代码最终也会在try或catch block显式返回时执行。
openMyFile()
try {
// tIE up a resource
writeMyFile(thedata);
}
finally {
cloSEMyFile(); // always close the resource
}示例
嵌套 try 块
首先让我们看看这里发生什么:
try {
try {
throw new Error("oops");
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
// Output:
// "finally"
// "outer" "oops"现在,如果我们已经在 try 语句中,通过增加一个 catch 语句块捕获了异常。
try {
try {
throw new Error("oops");
}
catch (ex) {
console.error("inner", ex.message);
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
// Output:
// "inner" "oops"
// "finally"现在,让我们再次抛出错误。
try {
try {
throw new Error("oops");
}
catch (ex) {
console.error("inner", ex.message);
throw ex;
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
// Output:
// "inner" "oops"
// "finally"
// "outer" "oops"任何给定的异常只会被离它最近的封闭 catch 块捕获一次。当然,在“inner”块抛出的任何新异常 (因为 catch 块里的代码也可以抛出异常),将会被“outer”块所捕获。
从 finally 语句块返回
如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch中。这包括在catch块里抛出的异常。
try {
try {
throw new Error("oops");
}
catch (ex) {
console.error("inner", ex.message);
throw ex;
}
finally {
console.log("finally");
return;
}
}
catch (ex) {
console.error("outer", ex.message);
}
// 注: 此 try catch 语句需要在 function 中运行才能作为函数的返回值, 否则直接运行会报语法错误
// Output:
// "inner" "oops"
// "finally"因为 finally 块里的 return 语句,"oops" 没有抛出到外层,从 catch 块返回的值同样适用。
相关推荐
- Windows 7:支持终止期限后的一年,数百万用户选择不升级 - Web前端
- 数据库:温故JSON语法规则的应用知识 - Web前端
- 如何执行Windows 10的全新安装:哪个选项最适合您? - Web前端
- FLEXBOX布局:使用弹性盒子进行高级布局 - Web前端
- 【Nuxt.js扩展Vue】Vue应用程序使用Nuxt.js可以避免的7个问题 - Web前端
- JavaScript对象入门:JavaScript中的继承 - Web前端
- JavaScript标准内置对象:Float32Array的基础知识和应用 - Web前端
- JavaScript标准内置对象:Object【构造函数创建一个对象包装器】 - Web前端
- 扎克伯格宣布无限期禁止特朗普的Facebook,Instagram帐户 - Web前端
- 带大家一起来了解下Flash的“穷途末路” - Web前端
- 网页前端技术排行
-
- 1[Web前端]用javascript实现默认图片替代未显示的图片 - Web前端
- 2分析Iconfont-阿里巴巴矢量常用图标库 - Web前端
- 3jQuery实例教程:制作网页中可折叠的面板 - Web前端
- 4【第六章】Foundation之按钮和下拉功能 - Web前端
- 5基于jquery的滚动条滚动固定div(附演示下载) - Web前端
- 6jQuery编写widget的一些技巧分享 - Web前端
- 7分享精心挑选的12款优秀jQuery Ajax分页插件和教程 - Web前端
- 8jQuery实现鼠标移到元素上动态提示消息框效果 - Web前端
- 9在Mac/PC上远程调试iPhone/iPad上的网页 - Web前端
- 最近发表
-
- WordPress随机显示特色图片插件:Random Post Thumbnails
- KeePass实现Chrome浏览器自动填充密码方法一
- LNMP一键包nginx 301强制跳转到https教程
- KeePass实现Chrome浏览器自动填充密码方法二
- #建站# 免费的VPS管理软件Xshell8/Xftp8中文版下载
- 使用Xshell 8连接VPS教程_电脑登录vps的方法
- WordPress评论界面添加烟花????效果
- 不同浏览器书签同步方案:坚果云+Floccus_详细使用教程
- iOS端KeePassXC客户端APP:Strongbox Password Safe
- 给WordPress评论中的Gravatar头像图片添加ALT属性


