【PowerShell】エラー処理(try catch finally)はこう使え!

                   

「PowerShellでコーディング終了!ちゃんとプログラム動けばOK!」で終わっているかもしれない方向け。
ちゃんとエラー処理していますか?エラーを垂れ流しにしてませんか?
この記事読めばPowerShellのエラー処理(try catch finally)の使い方がばっちり理解できるようになりますよ。

スポンサーリンク

本記事は下記の3本立てです。

本記事の内容

  • PowerShellのエラー処理でまずやること
  • 【PowerShell】エラー処理(try catch finally)はこう使え!
  • 【PowerShell】エラー処理(try catch finally)を使ったサンプルコード
  • 【PowerShell】エラー処理finallyが必須なのはどんな時?
  • 【PowerShell】ファイルを扱うエラー処理(try catch finally)のサンプルコード

PowerShellのエラー処理でまずやること

PowerShellはデフォルトではエラーが発生してもそのままプログラムを最後まで実行してしまう仕様になっています。

エラーが発生した状態でプログラムを最後まで実行しても、実行結果が正しいかどうかわからないし、時間かかる処理だったら時間も無駄だしパソコンにも無駄に負荷をかけてしまうしで、よろしくないですよね。

なので、エラーが発生した時点でプログラムの実行を中止してくださいよという記述をしてあげる必要があります。

コーディングではこう書きます。

$ErrorActionPreference = "Stop"

これをプログラムの一番最初に記述します。

【PowerShell】エラー処理(try catch finally)はこう使え!

エラーが発生したらプログラムの実行を中断してそのまま終わり…では、甘いです。

発生したエラーをキャッチしてユーザーにエラーが発生したことを伝えてあげなければいけません。

そのために必要なのがエラー処理!

PowerShellではtry catch finallyを使ってコーディングします。

使い方は以下の通り。

$ErrorActionPreference = "Stop"
try {
	プログラムの処理
} catch {
	エラーが発生した場合の処理
} finally {
	プログラムが無事終了しても、エラーが発生した場合でも、最後に必ず行う処理
}

これがPowerShellのエラー処理の書式。

finallyは必要がなければ省略可能です。

【PowerShell】エラー処理(try catch finally)を使ったサンプルコード

では、実際にコーディングするとどうなるか。

簡単なサンプルコードを作ってみました。

$ErrorActionPreference = "Stop"

try {
	
    Write-Host "A÷B=Cの割り算をします。`nまずはAを入力してください。`nA:"
    $A = Read-Host
    
    Write-Host "次にBを入力してください。`nB:"
    $B = Read-Host

    $C = $A / $B
    Write-Host "答えは$($C)です。"
    
} catch {

	Write-Host "エラーが発生しました。"

} finally {

	Write-Host "プログラムの実行を終了します。"

}

例えば、A=5、B=2と入力するとプログラムの実行結果は下記の通り。

A÷B=Cの割り算をします。
まずはAを入力してください。
A:
5
次にBを入力してください。
B:
2
答えは2.5です。
プログラムの実行を終了します。

しかし、A=7、B=0と入力するとプログラムの実行結果は下記の通りエラーで返ってきます。

A÷B=Cの割り算をします。
まずはAを入力してください。
A:
7
次にBを入力してください。
B:
0
エラーが発生しました。
プログラムの実行を終了します。

0で割ることはできませんからエラーが発生、発生したエラーがcatchでキャッチされて、finallyが実行されてプログラム実行終了となります。

スポンサーリンク

【PowerShell】エラー処理finallyが必須なのはどんな時?

先ほどご紹介したサンプルコードでは、finallyは省略しても特に問題ありません。

finallyは、無事にプログラムが実行された場合とエラーが発生した場合に必ず行わなければならない時に記述すればいいです。

といっても、一体どんなプログラムを実行するときにfinallyが必須になるのか気になりますよね。

例えば、ファイルを扱う処理の場合です。

ファイルに書き込みを行う場合、プログラムの処理は以下のような流れになります。

  1. ファイルを開く
  2. ファイルに書き込む
  3. ファイルを閉じる

もしこのプログラムを実行したときに、ファイルを開いて3に到達する前にエラーが発生した場合、ファイルを閉じる前にエラーがcatchにキャッチされて、そのままプログラムが終了してしまいます。

ということは、書き込み中のファイルが開いたまま…ということになってしまいます。

これではまずいですよね。

ファイルを開いたのなら、プログラムが無事に終了しようがエラーが発生しようが、必ず閉じなければいけません。

こういう場合に、finallyにファイルが開いていた場合は閉じるようにする処理を記述する必要があります。

【PowerShell】ファイルを扱うエラー処理(try catch finally)のサンプルコード

ではPowerShellでファイルを扱う場合のエラー処理のサンプルコーディングをご覧いただきましょう。

エラー処理を記述する前のコーディングを、【PowerShell】ファイル内を検索して対象行のみファイル出力する方法の記事の最初のサンプルコードだとします。

このサンプルコードにエラー処理のコーディングを加えると下記コーディングとなります。

# エラーが発生した場合、プログラムを終了する
$ErrorActionPreference = "Stop"

# 検索対象フォルダを指定
$infolder = "D:\PG"

try {

    Write-Host "抽出するキーワードを入力してください。"
    $keyword = Read-Host

    Write-Host "出力するファイル名を入力してください。"
    $outfilename = Read-Host

    # 出力するファイルを追記で開く
    $outputfile = New-Object System.IO.StreamWriter($outfilename,$true,[Text.Encoding]::GetEncoding("UTF-8"))
    
    # 検索対象フォルダの存在チェック
    if (Test-Path $infolder) {

        # 検索対象フォルダ内のファイル一覧を取得
        $infilelist = Get-ChildItem $infolder

        # 1ファイルずつ処理
        foreach ($infilename in $infilelist) {

            # ファイルの中身取得
            $line = Get-Content $infilename.FullName

            # 1行ずつ処理
            foreach ($getline in $line) {

                # キーワードがある行かどうかの判定
                if ($getline -like "*$($keyword)*") {

                    # 出力ファイルに行を書きだす
                    $outputfile.WriteLine("$($getline)")
                }
            }
        }
    }
} catch {
    
    Write-Host "エラーが発生しました。"

} finally {

    if ($outputfile.BaseStream -ne $null) {
        $outputfile.Close()
    }
}

finallyの処理は、ファイルが開いている場合に閉じるよう指示しています。

以上、【PowerShell】エラー処理(try catch finally)はこう使え!でした。

ではでは~^^

スポンサーリンク

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*