
エラートラップ!
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 ---
スポンサードリンク


