try...catch...finally

finally 块

finally 块包含的语句会在 try 块和 catch 块执行之后、及 try...catch...finally 块后面的语句执行之前执行。控制流始终会进入 finally 块,可以通过以下方式之一执行:

  • try 块正常执行结束后(没有抛出异常)立即执行;
  • 在 catch 块正常执行完毕后立即执行;
  • 紧接着在 try 代码块或 catch 代码块中的控制流语句(return、throw、break、continue)执行之前执行。

如果 try 代码块抛出异常,即使没有 catch 代码块来处理异常,finally 代码块仍会执行,在这种情况下,异常仍会在 finally 代码块执行完毕后立即抛出。

下面的示例展示了 finally 代码块的一种使用情况。代码先打开一个文件,然后执行使用该文件的语句;即使出现异常,finally 块也会确保文件在使用后始终关闭。

openMyFile();
try {
  // tie up a resource
  writeMyFile(theData);
} finally {
  closeMyFile(); // always close the resource
}

从 finally 语句块返回

如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch中。这包括在catch块里抛出的异常。


function testtry1 () {
    /**
     * 如果从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);
    }
    console.log("1111111111");

    // 注:此 try catch 语句需要在 function 中运行才能作为函数的返回值,否则直接运行会报语法错误
    // Output:
    // "inner" "oops"
    // "finally"
}

testtry1()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容