###
8 `optparse` のエラー処理法

`optparse` を使う場合に気を付けねばならないエラーには、 大きく分けてプログラマ側のエラーとユーザ側のエラーという二つの種類があります。 プログラマ側のエラーの多くは、例えば不正なオプション文字列や定義されていない オプション属性の指定、あるいはオプション属性を指定し忘れるといった、 誤った`parser.add_option()` 呼び出しによるものです。 こうした誤りは通常通りに処理されます。すなわち、例外(`optparse.OptionError` や `TypeError`) を送出して、プログラムをクラッシュさせます。 もっと重要なのはユーザ側のエラーの処理です。というのも、ユーザの操作エラーという ものはコードの安定性に関係なく起こるからです。 `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()` をオーバライドする必要があります。