6.21.2.8 optparse のエラー処理法

optparse を使う場合に気を付けねばならないエラーには、 大きく分けてプログラマ側のエラーとユーザ側のエラーという二つの種類があります。 プログラマ側のエラーの多くは、例えば不正なオプション文字列や定義されていない オプション属性の指定、あるいはオプション属性を指定し忘れるといった、 誤ったparse.add_option() 呼び出しによるものです。 こうした誤りは通常通りに処理されます。すなわち、例外(optparse.OptionErrorTypeError) を送出して、プログラムをクラッシュさせます。 もっと重要なのはユーザ側のエラーの処理です。というのも、ユーザの操作エラーという ものはコードの安定性に関係なく起こるからです。 optparse は、誤ったオプション引数の指定 (整数を引数にとるオプション -n に対して "-n4x" と指定してしまうなど) や、引数を 指定し忘れた場合 (-n が何らかの引数をとるオプションであるのに、 "-n" が引数の末尾に来ている場合) といった、ユーザによるエラーを自動的に 検出します。また、アプリケーション側で定義されたエラー条件が起きた場合、 parser.error() を呼び出してエラーを通知できます:

(options, args) = parser.parse_args()
[...]
if options.a and options.b:
    parser.error("options -a and -b are mutually exclusive")

いずれの場合にも optparse はエラーを同じやり方で処理します。すなわち、 プログラムの使用法メッセージとエラーメッセージを標準エラー出力に出力して、 終了ステータス 2 でプログラムを終了させます。

上に挙げた最初の例、すなわち整数を引数にとるオプションにユーザが "4x" を 指定した場合を考えてみましょう:

$ /usr/bin/foo -n 4x
usage: foo [options]

foo: error: option -n: invalid integer value: '4x'

値を全く指定しない場合には、以下のようになります:

$ /usr/bin/foo -n
usage: foo [options]

foo: error: -n option requires an argument

optparse は、常にエラーを引き起こしたオプションについて説明の入った エラーメッセージを生成するよう気を配ります; 従って、parser.error() を アプリケーションコードから呼び出す場合にも、同じようなメッセージになるように してください。

optparse のデフォルトのエラー処理動作が気に入らないのなら、 OptionParser をサブクラス化して、exit() かつ/または error() をオーバライドする必要があります。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。