关于try...catch...finally

704 阅读1分钟

try...catch...finally是我们常见的编程工具,今天我们来一起说一下JavaScript中try...catch...finally。

try语句


try语句具有三种形式:

1. try...catch
2. try...finally
3. try...catch...finally

try语句至少需要配合一个catchfinally出现,也可以catchfinally都出现。

catch的异常标识符


catch可以使用catch(e)来保存被抛出的异常值,当然也可以不声明异常标识符:

try{

}catch{

}

try...catch...finally的return


在JavaScript中try,catch,finally都可以有return语句:

function testTry() {
  try {
    return 1;
  } catch (ex) {
    return 2;
  } finally {
    return 3
  }
}

console.log(testTry()); // 3

可以看到他的执行顺序try -> (catch) -> finally,finally的返回值可以覆盖之前的返回值。

try...catch...finally的异常流


try...catch...finally的异常流会在沿着执行流发出,如果当前try存在catch会在当前catch-block中被捕获,如果不存在将异常向外层抛出

try {
  try {
    throw new Error("error1");
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer catch", ex.message);
}

// finally
// outer catch error1

当时需要注意的是当异常流传递到内部try语句的finally-block中是如果存在return语句,则会中止异常流的抛出

try {
  try {
    throw new Error("error1");
  }
  catch (ex) {
    console.error("inner catch", ex.message);
    throw ex;
  }
  finally {
    console.log("finally");
    return;
  }
}
catch (ex) {
  console.error("outer catch", ex.message);
}

// inner catch error1
// finally

可以看到异常并没有进入到外层的catch语句中。