社内SEの徒然なる日記

powerShellでエラーを処理をしてみた

エラートラップ!

powerShellでの死活監視も、今まで書いてきた内容を組み合わせてると、そこそこ動くようになってきました。(まぁ、実際には既に稼働してるんですけど)

んで、テストしてる時に困ったのがエラーが発生した時にpowerShellのウィンドウ自体が消えてしまって、エラーの内容が分からない事が多々あったんです。というわけで、エラートラップの方法を調べてみました。

エラートラップは、trap { … } で拾えました(trapの記述箇所は同一スコープ内ならどこでもOKらしい)。

問題は、PowerShellには「終了するエラー」と「続行するエラー」があり、通常は終了するエラーしか拾えないらしいです。確証はないのですが、おそらく「続行するエラー」とは、ユーザーに動作方法を問い合わせるようなエラーのことじゃないでしょうか?

対話方式でならそれでも良いが、バッチ処理で自動実行する場合はそれじゃぁまずい(応答が返せない)。さらに調べると、自動変数「$ErrorActionPreference」に"Stop"と設定してやると、全てのエラーを拾ってくれるようにるとのことです。ちなみに、こいつの初期値は"Continue"の模様。

やりたいのは、”全てのエラーをトラップする”です。結果、こんなソースになりました。
# エラートラップの設定
$ErrorActionPreference = "Stop"   # Stop(停止), Inquire ( 問い合わせ ), Continue ( 続行 )

・・・ 何らかの処理 ・・・

# エラートラップ
trap {
$Error[0]
}


実際には、エラー発生時には、以前に書いたログ出力関数でログにエラーを吐くようにしてます。

ちなみに、サンプルの $Errorには、過去に発生したエラー(例外)のリストが自動的に格納される自動変数です。直前に発生した例外は、$Error[0] に入っています。

エラーを強制発生

もうひとつ必要だったのが、強制的にエラーを発生させる方法です。これは、throwを使うことで実現する事が出来ました。
throw 'ディスク容量不足のため、処理を停止します。'


サンプルのメッセージからも分かると思いますが、特定の条件を満たさない場合にはエラーとしたかったんです。

基幹システムとかで作る時は、強制的にエラーを発生させるのは、完全に想定外のシステムエラーを捉える時だけなので、こういう使い方は違和感があるんですけど、スクリプト言語なので、処理分岐とか複雑になるようなことはしたくなかったんですよね。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する