JS try catch语句一般在啥情况下使用?是必须使用的吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS try catch语句一般在啥情况下使用?是必须使用的吗相关的知识,希望对你有一定的参考价值。
try catch的使用,永远应该放在你的控制范围之内,而不应该防范未知的错误。也就是说你很清楚知道这里是有可能”出错“的,而且你很清楚知道什么前提下会出错,你就是要故意利用报错信息来区分错误,后续的程序会解决所有的出错,让程序继续执行。如果让用户先发现你根本没预料到的错误,而不是你先发现错误,你是失职的。大多数情况下,try catch适用于两种场合:
1、浏览器原罪的场合:也就是兼容性场合,因为浏览器兼容性不是程序员能改正的,所以只能try catch:由于不同浏览器的报错提示是不一样的,根据捕获的浏览器的报错提示判断用户的浏览器,然后做出对应的措施,这时候使用try catch是巧妙的办法,如果用if就比较笨拙,因为if通常只能反馈真或假,不能直接反馈浏览器的报错内容。
2、考虑如下代码。window.a.b是非法的,再跟2对比就没有意义,这样非法的条件,在try catch中仍可以继续运行下去。但在if中window.a.b已经报错,整个页面都会坏掉。如果希望用if写,那么必须先判断window.a是否是合法的,window.a是合法的前提下再判断window.a.b是不是合法的,如果也是合法的,再判断window.a.b是否不等于2,这样是不是很蠢?这时就体现出try catch的妙处了,程序不但知道window.a.b !== 2是假的,而且直接可以知道究竟哪一步就已经是假的。再想象一下,有一个变量是json.a.b.c,其中的a/b/c都可能是存在的也可能是不存在的,全看具体情况,这时候你简单的写if (json.a.b.c === 2) ...是不行的,因为json.a.b就可能已经是非法的,所以你如果用if,就要考虑a是不是非法的、a是合法前提下b是不是非法的,b是合法前提下c是不是非法的。但是json.a.b.c === 2在try中就可以直接写,也就是说,我不关心究竟a/b/c谁是非法的,我只关心json.a.b.c到底是不是等于2,不等于2或者任何一步出错,对我来讲没有区别,反正都是不等于2,我不关心哪步出错,而且程序不会坏掉。这是一种比较省心的写法。另外注意,try catch不能做真假判断,只能做非法判断。也就是说:try 1 === 2,虽然1===2是假,但是是合法的,catch不会捕捉到错误,也不会告诉你1 === 2到底是真是假。所以,写在try里的应该是json.a.b.c而不是json.a.b.c === 2。究竟是不是等于2,是后面的事,是if干的事。简单说,try catch用于捕捉报错,当你不关心哪一步错误,只关心有没有错,就用try catch。
trywindow.a.b !== 2
catch(err)
alert(err) // 可执行
alert(123) // 可执行
if (window.a.b !== 2)
alert("error") // 不执行
alert(123); // 不执行
最后,try catch在早期被各种语言的程序员滥用,try catch出现的场合被夸大了,事实上没那么多适用场合。如果你的几千行程序都没用到try catch也是很正常的,尤其是用了jquery。
参考技术A 当预计某段代码可能会出错(比如浏览器兼容问题)或者想故意利用这种错误来达成目的(这其实是一种偷懒的行为)时,就可以把这段代码放入try内,然后当出现错误时就会自动去执行catch里的代码。如果程序可以做到完全无错误,那肯定是用不上try catch语句的,但世事难料,js作为网页脚本语言,必须依赖于浏览器,而浏览器的种类千差万别,除了主流的标准浏览器,还有各种各样奇形怪状的特殊浏览器(光是IE就能让程序员死上千百回),即使再怎么努力,也难免百密一疏,可以说完全无错误的js代码是不存在的,因此为了保证程序的健壮性和用户体验,使用try catch语句还是很有必要的,而且这也是一个良好习惯。本回答被提问者采纳
try...catch 语句
一般情况下,我们很少用到 try...catch 语句,但是有时候为了测试代码中的错误,也有可能会用到。小白我也在工作中用到过。那么好的程序设计,什么时候会用到呢?
try...catch 一般用来捕获宿主对象或者ECMAScript抛出的异常。
1 try{ 2 // 此处运次代码 3 } catch(err) { 4 // 此处处理代码 5 }
【注意】该语句严格区分大小写,使用大写字母会出错。
并且,try...catch...finally 为JS 实现错误处理:
try { tryStatements // 必选项,可能发生错误的语句 } catch(exception) { // exception 可选项,任何变量名,exception的初始化值是扔出的错误的值 catchStatements //可选项,处理在相关联的 tryStatement 中发生的错误的语句 } finally { finallyStatements // 可选项,在所有其他过程发生之后无条件执行的语句 }
try...catch...finally 语句提供了一种方法来处理可能发生在给定代码块中的某些或全部错误,同时仍保持代码的运行。如果发生了程序员没有处理的错误,JS 只给用户提供它的普通错误消息,就好象没有错误处理一样。
tryStatements 参数包含可能发生错误的代码,而 catchStatement 则包含处理任何发生了的错误的代码。如果在 tryStatements 中发生了一个错误,则程序控制被传给 catchStatements 来处理。exception 的初始化值是发生在 tryStatements 中的错误的值。如果错误不发生,则不执行 catchStatements。
如果在与发生错误的 tryStatements 相关联的 catchStatements 中不能处理该错误,则使用 throw 语句来传播、或重新扔出这个错误给更高级的错误处理程序。
在执行完 tryStatements 中的语句,并在 catchStatements 的所有错误处理发生之后,可无条件执行 finallyStatements 中的语句。
请注意,即使在 try 或 catch 块中返回一个语句,或在 catch 块重新扔出一个错误,仍然会执行 finallyStatements 编码。 一般将确保 finallyStatments 的运行,除非存在未处理的错误。(例如,在 catch 块中发生运行时错误)。
以上是关于JS try catch语句一般在啥情况下使用?是必须使用的吗的主要内容,如果未能解决你的问题,请参考以下文章
Java try/catch/finally内部执行顺序&外部语句何种情况下执行
VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)
Js不使用try catch,优雅地处理await报错的情况