try catch finally
用法
1 | try { |
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子句。
无条件 catch
无条件catch块就是单个子句的try..catch抛出的异常都会被catch捕获,例如,当在下面的代码中发生异常时,控制转移到catch子句。
1 | try { |
打印出来的错误时可以自定义的。catch块指定一个标识符,该标识符保存由throw语句指定的值。catch块是唯一的,因为当输入catch块时,JavaScript 会创建此标识符,并将其添加到当前作用域;标识符仅在catch块执行时存在;catch块执行完成后,标识符不再可用。
1 | try { |
try块中的抛出一个异常时,exception_var(如catch (e)中的e)用来保存被抛出声明指定的值。你可以用这个标识符来获取关于被抛出异常的信息。
这个标识符是catch子语句内部的。换言之,当进入catch子语句时标识符创建,catch子语句执行完毕后,这个标识符将不再可用。
finally
finally块包含的语句在try块和catch之后,try..catch..finally块后的语句之前执行。请注意,无论是否抛出异常finally子句都会执行。此外,如果抛出异常,即使没有catch子句处理异常,finally子句中的语句也会执行。
1 | openMyFile() |
嵌套try
例1:
1 | try { |
例2:如果已经在 try 语句中,通过增加一个 catch 语句块捕获了异常
1 | try { |
例3:在新增的catch里不干正事继续抛错误
1 | try { |
例4:
1 | function setName () { |
如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch中。这包括在catch块里抛出的异常。因为 finally 块里的 return 语句,"oops" 没有抛出到外层,从 catch 块返回的值同样适用。