2010年6月24日木曜日

◆例外処理

PowerShell: ◆ヘルプをメモ帳で表示する でCatchできないエラーがあることが分かった。
調べてみるとエラーには「終了するエラー」と「続行するエラー」があり、Catchできるのは「終了するエラー」だけのようだ。
(エラーの詳細は、about_errorsを参照しろとヘルプにあるが、このトピックは存在しなかった)

そこで、ErrorActionパラメータに「Stop」を指定してCatchできるようにする。

Function gh{

    $path = Join-Path  $env:temp  PSHelp.txt
    try{
        Invoke-Expression "Get-Help $args  -ErrorAction Stop" | Out-File $path -Width 61
    }
    catch{ throw $error[0] }
    notepad $path
}


ErrorActionの規定値はErrorActionPreference自動変数で管理されていて、この初期値がContinueになっている。
よって、この値をStopにして、個別に続行させたいコマンドに対してErrorActionでContinueを指定するのも良いかもしれない。

Function gh{
    $ErrorActionPreference = "Stop"
    $path = Join-Path  $env:temp  PSHelp.txt
    try{
        Invoke-Expression "Get-Help $args "  | Out-File $path -Width 61
    }
    catch{ throw $error[0] }
    notepad $path

}


また、trapステートメントを使って以下のような書き方もできる。

Function gh{
    trap{ throw $error[0] }
    $ErrorActionPreference = "Stop"
    $path = Join-Path  $env:temp  PSHelp.txt
    Invoke-Expression "Get-Help $args "  | Out-File $path -Width 61
    notepad $path
}

$error[0]の代わりに $_  を指定しても良い。

Function gh{
    trap{ throw $_ }
    $ErrorActionPreference = "Stop"
    $path = Join-Path  $env:temp  PSHelp.txt
    Invoke-Expression "Get-Help $args "  | Out-File $path -Width 61
    notepad $path
}


ちなみに、Trapステートメントはどこに書いても有効なようだ(同一スコープ内で)。
VBのOn Error Goto 0 (だっけ?)のように途中で無効にする方法は見つけられなかった。
まぁ、Try~Catch~Finally(Version2から)があるので問題ないだろう。

0 件のコメント:

コメントを投稿