スタッフブログ

PowerShell での Try-Catch 構文(エラーハンドリング)について


皆さんこんにちは。
今週のブログは T.S. が担当させていただきます。

今回は PowerShell を使用したエラーハンドリングの方法についてご紹介いたします。

Try-Catch 構文とは

皆さんは Try-Catch を使用していますか?
Try-Catch はプログラムが実行中に発生するエラーや例外を処理するための構文です。これにより、プログラムがクラッシュすることなく、適切にエラーを処理し、必要に応じてリカバリやログ出力を行うことができます。以下は、一般的な Try-Catch 構文についての説明です。

try {
# ここに実行したいコードを記述
}
catch {
# ここにエラーが発生した場合の処理を記述
}

PowerShell での Try-Catch 構文の挙動

私は普段プログラムを作成する際はC# で書いておりこの構文をよく使用していますが、 Try ブロックの中でエラーが発生した場合は即座に Catch ブロックでエラーをキャッチします。
しかし PowerShell ではデフォルトで実行される Try-Catch 構文の挙動が少し違ったみたいです。

try{
Write-Host “あ”
Write-Host “い”
Write-Host “う”
Write-Host “え”
Write-Host “お”
Write-Error “ああああ” #エラー発生
Write-Host “か”
}
catch {
Write-Host “例外”
}
Write-Host “終了”

出力:






try{
Write-Host “あ”
Write-Host “い”
Write-Host “う”
Write-Host “え”
Write-Host “お”
Write-Error “ああああ”
Write-Host “か”
}
catch {
Write-Host “例外”
}
Write-Host “終了” : ああああ
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException


終了

Write-Error でエラーが発生してもスクリプトは「 Write-Host “か” 」を実行してしまいます。 Catch ブロックは実行されません。

$ErrorActionPreference でエラー処理の動作を制御

PowerShell には、エラー処理の動作を制御するための変数 $ErrorActionPreference があります。この変数により、エラーが発生したときに PowerShell がどのように動作するかを指定できます。以下の値が設定可能です:

  • Continue:デフォルトの動作で、エラーが発生しても続行します。(上記スクリプト実行の挙動と等しい)
  • Stop:エラーが発生すると、例外がスローされ、Catchブロック内で処理されます。
  • SilentlyContinue:エラーメッセージを表示せずに続行します。
  • Inquire:エラーが発生したときにユーザーにどうするかを尋ねます。

PowerShell では $ErrorActionPreference がデフォルで Continue に設定されているため、上記で実行したスクリプトではエラーが起きても「 Write-Host “か” 」が実行されていたということになります。
では、「 $ErrorActionPreference = “Stop”をつけて実行してみましょう。

$ErrorActionPreference = “Stop”
try{
Write-Host “あ”
Write-Host “い”
Write-Host “う”
Write-Host “え”
Write-Host “お”
Write-Error “ああああ” #エラーが発生
Write-Host “か”
}
catch {
Write-Host “例外”
}
Write-Host “終了”

出力






例外
終了

「Write-Host “か”」は実行されず、エラーが発生した時点で例外をキャッチできていることが確認できます。私の中で普段通りの違和感の無い処理になります。

最後に

今回は PowerShell での Try-Catch 構文の挙動の違いについて説明しました。
私自身、 Try-Catch 構文での処理方法は各プログラム言語で全て同じものだと思っていたため、新しい発見を得ることができました。
しかし私はデフォルト設定( $ErrorActionPreference = “Continue” )では全く慣れないため、「 $ErrorActionPreference = “Stop” を必ず宣言して使うようにしております。
PowerShell スクリプトでの目的によって $ErrorActionPreference 変数の値を使い分けてみるのもありですね。

最後までご覧いただきありがとうございました!