[PowerShell] try-catch-finallyをネストしたときの挙動

Last updated on :August 28th, 2023 at 05:23 pm

PowerShellでtry-catch-finally構文を二重ネストして使うことがあったのですが、内側のcatchでexitした後の挙動についてまとまった記事がなかったのでメモ。

知りたいこと

以下のようにtry-catch-finally構文で二重ネストした時、内側のcatchで例外を捉えてexit 1した時に内外のfinallyはそれぞれ実行されるのか?

try{
    ①(外側のtryブロック)
    try{
        ②(内側のtryブロック)
    }
    catch{
        ③(内側のcatchブロック)
        ※ブロックの最後にexit 1
    }
    finally{
        ④(内側のfinallyブロック)
    }
}
catch{
    ⑤(外側のcatchブロック)
}
finally{
    ⑥(外側のfinallyブロック)
}

結論

③(内側のcatchブロック)で例外を捉えてexit 1 する場合の処理の流れは以下の通り

  1. ①(外側のtryブロック)
  2. ②(内側のtryブロック) ※例外発生
  3. ③(内側のcatchブロック) exit 1
  4. ④(内側のfinallyブロック)
  5. ⑥(外側のfinallyブロック)

catchブロックは例外を捉えた時だけ実行されますが、finallyブロックは例外が発生してもしなくても実行されます。

参考サイト

https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-exceptions?view=powershell-7.3#trycatch

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_language_keywords?view=powershell-7.3#exit

Leave a Reply

Your email address will not be published. Required fields are marked *