Я использую модуль mechanize для выполнения некоторых веб-запросов из Python. Я хочу, чтобы моя программа была устойчивой к ошибкам и корректно обрабатывала все виды ошибок (неправильные URL-адреса, ответы 403/404). Однако я не могу найти в документации Mechanize ошибки / исключения, которые он выдает для различных ошибок.
Я просто называю это:
self.browser = mechanize.Browser()
self.browser.addheaders = [('User-agent', browser_header)]
self.browser.open(query_url)
self.result_page = self.browser.response().read()
Как я могу узнать, какие ошибки / исключения могут быть выброшены здесь, и обработать их?






Я нашел это в их документах:
One final thing to note is that there are some catch-all bare except: statements in the module, which are there to handle unexpected bad input without crashing your program. If this happens, it's a bug in mechanize, so please mail me the warning text.
Так что, полагаю, они не делают никаких исключений. Вы также можете выполнить поиск подклассов Exception в исходном коде и посмотреть, как они используются.
В этом случае исключения urllib2 очень хорошо документированы: docs.python.org/lib/module-urllib2.html
$ perl -0777 -ne'print qq() if /__all__ = \[(.*?)\]/s' __init__.py | grep Error
'BrowserStateError',
'ContentTooShortError',
'FormNotFoundError',
'GopherError',
'HTTPDefaultErrorHandler',
'HTTPError',
'HTTPErrorProcessor',
'LinkNotFoundError',
'LoadError',
'ParseError',
'RobotExclusionError',
'URLError',
Или же:
>>> import mechanize
>>> filter(lambda s: "Error" in s, dir(mechanize))
['BrowserStateError', 'ContentTooShortError', 'FormNotFoundError', 'GopherError'
, 'HTTPDefaultErrorHandler', 'HTTPError', 'HTTPErrorProcessor', 'LinkNotFoundErr
or', 'LoadError', 'ParseError', 'RobotExclusionError', 'URLError']
Как указывает Николас, Mechanize часто распространяет исключения urllib2 - см. Ссылка Alexanders на документацию urllib2
@James Broadhead: HTTPError, который вы видите выше являетсяurllib2.HTTPError. Вам нет нужно явно импортировать urllib2. mechanize предоставляет расширенный набор интерфейса urllib2.
Вы правы в том, что не нужно явно ссылаться на urllib2 - я просто хотел дать ссылку на документацию.
Хотя это было опубликовано давно, я думаю, что все еще существует необходимость правильно ответить на вопрос, поскольку он появляется в результатах поиска Google именно по этому вопросу.
Когда я пишу это, Mechanize (версия = (0, 1, 11, None, None)) в Python 265 вызывает urllib2.HTTPError, и поэтому статус http доступен через перехват этого исключения, например:
import urllib2
try:
... br.open("http://www.example.org/invalid-page")
... except urllib2.HTTPError, e:
... print e.code
...
404
-1: mechanize предоставляет расширенный набор интерфейса urllib2. mechanize.HTTPError is urllib2.HTTPError.
Я не уверен, что вы правы, потому что механизация, похоже, распространяет исключения из базовых вызовов urllib2.