none
例外処理が機能しない場合がある RRS feed

  • 質問

  • お世話になります。

    例外処理を実装しようとしたのですが、うまく機能しない場合があります。

    例外処理の場合、1を戻り値としたいのですが、

    例えば、起動していないプロセスを停止しようとした場合や直接0除算を行った場合は機能しません。

    変数を経由した0除算や型の不一致は機能します。

    解決策を教えて頂けないでしょうか?

    trap {
        return 1
    }

    NG:Stop-Process -name TEST
    NG:10 / 0

    OK:$num = 0
          10 / $num
    OK:[int]'test'

    return 0

    2012年11月22日 6:09

回答

  • 一般的なコマンドレットは、エラー時に例外を投げません。例外が発生するのは、主にオペレータ等の使用に関するミスや .NET のメソッドを呼び出した場合です。

    コマンドレットはエラー発生時に ErrorAction に従った動作を行います。エラーが発生したかどうかは、自動変数 $? に記録されます。

    詳しくは help about_CommonParameters および about_Automatic_Variables をどうぞ。

    2012年11月22日 6:41

すべての返信

  • 一般的なコマンドレットは、エラー時に例外を投げません。例外が発生するのは、主にオペレータ等の使用に関するミスや .NET のメソッドを呼び出した場合です。

    コマンドレットはエラー発生時に ErrorAction に従った動作を行います。エラーが発生したかどうかは、自動変数 $? に記録されます。

    詳しくは help about_CommonParameters および about_Automatic_Variables をどうぞ。

    2012年11月22日 6:41
  • K.Takaoka様

    お世話になります。

    回答有り難うございます。

    スクリプト開始時に$ErrorActionPreference = "Stop"でエラー時に例外を投げるようにして、

    スクリプト終了時、規定値に戻すようにすることで対応しようと思います。

    有難うございました。

    2012年11月22日 7:30
  • スクリプト終了時、規定値に戻すようにすることで対応しようと思います。

    ドットスコープでの実行を前提としていないならば、戻す必要はないです。

    昔書いたものでよろしければ、http://d.hatena.ne.jp/ladybug/20111201 にちらっと書いてみています。

    2012年11月22日 9:00
  • K. Kataokaさんのご回答の通り、コマンドレットのエラーは基本的にはtrapできません、が、裏技的にtrapする方法はあります。以下のスレッドを参照してください。

    PowerShellの例外処理について

    それと、10/0のような0除算エラーがトラップできない件ですが、これはパースの段階で発生するエラーで、いわゆる文法エラーに近いものであるためのようです。

    余談ですが、PowerShell 3.0ではパーサーが一新されたため、その副作用(?)で、10/0のような0除算エラーがtrapできるようになっています。

    2012年11月22日 10:00
    モデレータ