##
2 OpenerDirector オブジェクト

`OpenerDirector` インスタンスは以下のメソッドを持っています:

`add_handler`( | handler)

  handler は `BaseHandler` のインスタンスでなければ なりません。以下のメソッドを使った検索が行われ、URL を取り扱うことが 可能なハンドラの連鎖が追加されます (HTTP エラーは特別扱いされている ので注意してください)。

  - `protocol_open()` -- ハンドラが protocol の URL を開く方法を知っているかどうかを 調べます。
  - `http_error_type()` -- ハンドラが HTTP エラーコード type の処理方法を知っていることを 示すシグナルです。
  - `protocol_error()` -- ハンドラが (`http` でない) protocol のエラー を処理する方法を知っていることを示すシグナルです。
  - `protocol_request()` -- ハンドラが protocol リクエストのプリプロセス方法 を知っていることを示すシグナルです。
  - `protocol_response()` -- ハンドラが protocol リクエストのポストプロセス方法 を知っていることを示すシグナルです。

`open`( | url[, data])

  与えられた url (リクエストオブジェクトでも文字列でも かまいません) を開きます。オプションとして data を与えることが できます。 引数、返り値、および送出される例外は `urlopen()` と同じ です (`urlopen()` の場合、標準でインストールされている グローバルな `OpenerDirector` の `open()` メソッドを 呼び出します) 。

`error`( | proto[, arg[, ...]])

  与えられたプロトコルにおけるエラーを処理します。このメソッドは 与えられたプロトコルにおける登録済みのエラーハンドラを (プロトコル固有の) 引数で呼び出します。 HTTP プロトコルは特殊な ケースで、特定のエラーハンドラを選び出すのに HTTP レスポンスコード を使います; ハンドラクラスの `http_error_*()` メソッドを 参照してください。

  返り値および送出される例外は `urlopen()` と同じものです。

OpenerDirector オブジェクトは、以下の 3 つのステージに分けて URL を開きます:

各ステージで OpenerDirector オブジェクトのメソッドがどのような 順で呼び出されるかは、ハンドラインスタンスの並び方で決まります。

1. `protocol_request()` 形式のメソッドを持つ 全てのハンドラに対してそのメソッドを呼び出し、リクエストの プリプロセスを行います。

2. `protocol_open()` 形式のメソッドを持つ ハンドラを呼び出し、リクエストを処理します。 このステージは、ハンドラが`None` でない値 (すなわち レスポンス) を返すか、例外 (通常は URLError) を送出した時点で 終了します。例外は伝播 (propagate) できます。

   実際には、上のアルゴリズムではまず `default_open` という名前の メソッドを呼び出します。このメソッドが全て `None` を返す場合、 同じアルゴリズムを繰り返して、今度は `protocol_open()` 形式のメソッドを試します。メソッドが全て `None` を返すと、 さらに同じアルゴリズムを繰り返して `unknown_open()` を呼び出します。

   これらのメソッドの実装には、親となる `OpenerDirector` インスタンスの `.open()` や`.error()` といったメソッド 呼び出しが入る場合があるので注意してください。

3. `protocol_response()` 形式のメソッドを持つ 全てのハンドラに対してそのメソッドを呼び出し、リクエストの ポストプロセスを行います。