WindowsPowerShell

PowerShellのエラーハンドリング【try-catch・throw・ErrorActionを徹底解説】

WindowsPowerShell
記事内に広告が含まれています。

PowerShellではtry-catch-finallyブロックを使って例外を安全に処理できます。バッチファイルのerrorlevelと違い、エラーの種類を判別して適切に対応できるのがPowerShellの強みです。

try-catch-finallyの基本

try {
    # エラーが発生する可能性のある処理
    $result = 100 / 0
} catch {
    # エラー発生時の処理
    Write-Host "エラーが発生しました: $_"
} finally {
    # 成功・失敗にかかわらず必ず実行
    Write-Host "処理終了"
}

エラーの種類で処理を分ける

try {
    Get-Content "存在しないファイル.txt" -ErrorAction Stop
} catch [System.IO.FileNotFoundException] {
    Write-Host "ファイルが見つかりません"
} catch [System.UnauthorizedAccessException] {
    Write-Host "アクセス権限がありません"
} catch {
    Write-Host "予期しないエラー: $($_.Exception.Message)"
}

$Error と -ErrorAction

-ErrorAction値動作
Continue(デフォルト)エラーを表示して処理を続ける
Stopエラーを例外として投げてcatchできるようにする
SilentlyContinueエラーを無視して続ける(エラーを表示しない)
Inquireユーザーに続行するか確認する
# catchするにはStopが必要
Get-Item "C:\存在しない" -ErrorAction Stop

# エラーを無視(存在確認などで使う)
$proc = Get-Process "存在しないプロセス" -ErrorAction SilentlyContinue
if ($null -eq $proc) { Write-Host "プロセスなし" }

# $ErrorPreference でスクリプト全体のデフォルトを変更
$ErrorActionPreference = "Stop"

throw で例外を自分で発生させる

function Test-FileSize {
    param([string]$Path, [int]$MaxMB = 100)
    $file = Get-Item $Path
    $sizeMB = [math]::Round($file.Length / 1MB, 2)
    if ($sizeMB -gt $MaxMB) {
        throw "ファイルサイズが上限を超えています: ${sizeMB}MB > ${MaxMB}MB"
    }
    Write-Host "ファイルサイズOK: ${sizeMB}MB"
}

try {
    Test-FileSize -Path "C:\bigfile.zip" -MaxMB 50
} catch {
    Write-Host "エラー: $_"
}

まとめ

  • try-catch-finallyで例外を安全に処理できる
  • エラーの型([System.IO.FileNotFoundException]等)で処理を分岐できる
  • catchするには-ErrorAction Stopが必要
  • throwで自前の例外を発生させてエラーを明示的に伝えられる

コメント

タイトルとURLをコピーしました