##
11.5.3 BaseHandler Objects

`BaseHandler` objects provide a couple of methods that are directly useful, and others that are meant to be used by derived classes. These are intended for direct use:

`add_parent`(director)
  Add a director as parent.

`close`()
  Remove any parents.

The following members and methods should only be used by classes derived from `BaseHandler`:

`parent`
  A valid `OpenerDirector`, which can be used to open using a different protocol, or handle errors.

`default_open`(req)
  This method is not defined in `BaseHandler`, but subclasses should define it if they want to catch all URLs.

  This method, if implemented, will be called by the parent `OpenerDirector`. It should return a file-like object as described in the return value of the `open()` of `OpenerDirector`, or `None`. It should raise `URLError`, unless a truly exceptional thing happens (for example, `MemoryError` should not be mapped to `URLError`).

  This method will be called before any protocol-specific open method.

protocol_open(req)
  This method is not defined in `BaseHandler`, but subclasses should define it if they want to handle URLs with the given protocol.

  This method, if defined, will be called by the parent `OpenerDirector`. Return values should be the same as for `default_open()`.

`unknown_open`(req)
  This method is not defined in `BaseHandler`, but subclasses should define it if they want to catch all URLs with no specific registered handler to open it.

  This method, if implemented, will be called by the `parent` `OpenerDirector`. Return values should be the same as for `default_open()`.

`http_error_default`(req, fp, code, msg, hdrs)
  This method is not defined in `BaseHandler`, but subclasses should override it if they intend to provide a catch-all for otherwise unhandled HTTP errors. It will be called automatically by the `OpenerDirector` getting the error, and should not normally be called in other circumstances.

  req will be a `Request` object, fp will be a file-like object with the HTTP error body, code will be the three-digit code of the error, msg will be the user-visible explanation of the code and hdrs will be a mapping object with the headers of the error.

  Return values and exceptions raised should be the same as those of `urlopen()`.

`http_error_nnn`(req, fp, code, msg, hdrs)
  nnn should be a three-digit HTTP error code. This method is also not defined in `BaseHandler`, but will be called, if it exists, on an instance of a subclass, when an HTTP error with code nnn occurs.

  Subclasses should override this method to handle specific HTTP errors.

  Arguments, return values and exceptions raised should be the same as for `http_error_default()`.