TypeScript で例外が発生した場合に catch と finally がどのような順に実行されるかを調べてみました。
以下のプログラムでは、func1() から func2() を呼び出し、func2() からはさらに func3() を呼び出します。
func3() 内で throw した場合に、catch と finally がどのような順で呼び出されるかを確認します。
■プログラム
■実行結果
実行結果をみると、finally が定義されている場合には catch が実行された後に finally が呼び出されていますが、catch 内で throw した場合には呼び出し元の処理に戻る前に finally が実行されています。
以下のプログラムでは、func1() から func2() を呼び出し、func2() からはさらに func3() を呼び出します。
func3() 内で throw した場合に、catch と finally がどのような順で呼び出されるかを確認します。
■プログラム
function func1() { try { console.log("func1: start"); func2(); } catch (e) { console.log("func1: catch"); } finally { console.log("func1: finally"); } console.log("func1: end"); } function func2() { try { console.log("func2: start"); func3(); } catch (e) { console.log("func2: catch"); throw e; } finally { console.log("func2: finally"); } console.log("func2: end"); } function func3() { try { console.log("func3: start"); throw 'func3'; } catch (e) { console.log("func3: catch"); throw e; } finally { console.log("func3: finally"); } console.log("func3: end"); } func1();
■実行結果
func1: start func2: start func3: start func3: catch func3: finally func2: catch func2: finally func1: catch func1: finally func1: end
実行結果をみると、finally が定義されている場合には catch が実行された後に finally が呼び出されていますが、catch 内で throw した場合には呼び出し元の処理に戻る前に finally が実行されています。