PowerShellにて、例外として処理できないコマンドレットが存在していました。
対処法として、上記コマンドレットに「-ErrorAction Stop」を追加したところ、
例外として処理できるようになりました。
今回は、該当コマンドレットの一つである「Get-ChildItem」を使用し、サンプルとして投稿していこうと思います。
<前提>
以下のファイルはエクスプローラーに存在しておりません。
"C:\hoge.txt"
まずは「Get-ChildItem」が例外として処理できないコマンドレットであることを確認します。
■スクリプト内容
Write-Output "start"
try{
Get-ChildItem "C:\hoge.txt"
}catch{
Write-Output "例外をcatchしたよ!プログラムを終了します。"
exit
}
Write-Output "end"
■出力結果
start
Get-ChildItem : パス 'C:\hoge.txt' が存在しないため検出できません。
発生場所 C:\Users\Administrator\Desktop\test\hoge.ps1:4 文字:5
+ Get-ChildItem "C:\hoge.txt"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\hoge.txt:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
end
catch内の処理が実行されていないことから「Get-ChildItem」が例外として処理できないコマンドレットであることが確認できます。
また"end"の出力があるため、最後まで処理が実行されたことも確認できます。
続いて「Get-ChildItem」に「-ErrorAction Stop」を追加し、例外として処理できるようになることを確認します。
■スクリプト内容
Write-Output "start"
try{
Get-ChildItem "C:\hoge.txt" -ErrorAction Stop
}catch{
Write-Output "例外をcatchしたよ!プログラムを終了します。"
exit
}
Write-Output "end"
■出力結果
start
例外をcatchしたよ!プログラムを終了します。
catch内の処理が実行されているため「Get-ChildItem」が例外として処理できていることが確認できます。また"end"の出力は無いため、catch内のexitにて処理が終了したことも確認できます。
他プログラミング言語であるJavaでは、例外処理が発生しない(例外クラスのインスタンスが生成されない)経験が無かったので、今回とても勉強になりました。
PowerShellの仕様も徐々に理解していきたいです。
Comments