代码之家  ›  专栏  ›  技术社区  ›  davidmytton

我需要使用urllib2.request/urlopen处理哪些错误/异常?

  •  57
  • davidmytton  · 技术社区  · 17 年前

    我有以下代码可以回发到远程URL:

    request = urllib2.Request('http://www.example.com', postBackData, { 'User-Agent' : 'My User Agent' })
    
    try: 
        response = urllib2.urlopen(request)
    except urllib2.HTTPError, e:
        checksLogger.error('HTTPError = ' + str(e.code))
    except urllib2.URLError, e:
        checksLogger.error('URLError = ' + str(e.reason))
    except httplib.HTTPException, e:
        checksLogger.error('HTTPException')
    

    使用使用urlib.urlencode编码的字典创建回发数据。checkslogger是一个使用 logging .

    当远程服务器关闭并且代码退出时(这是在客户服务器上的,所以我不知道此时退出堆栈转储/错误是什么),我在运行此代码时遇到了一个问题。我假设这是因为有一个异常和/或错误没有被处理。那么,是否还有其他可能被触发的异常,而我不在上面处理?

    5 回复  |  直到 7 年前
        1
  •  58
  •   vartec    17 年前

    添加通用异常处理程序:

    request = urllib2.Request('http://www.example.com', postBackData, { 'User-Agent' : 'My User Agent' })
    
    try: 
        response = urllib2.urlopen(request)
    except urllib2.HTTPError, e:
        checksLogger.error('HTTPError = ' + str(e.code))
    except urllib2.URLError, e:
        checksLogger.error('URLError = ' + str(e.reason))
    except httplib.HTTPException, e:
        checksLogger.error('HTTPException')
    except Exception:
        import traceback
        checksLogger.error('generic exception: ' + traceback.format_exc())
    
        2
  •  17
  •   Victor Schröder    9 年前

    docs page urlopen 入口,看起来你只需要抓住 URLError . 如果你真的想避免在URLLIB代码中出现问题,你也可以 Exception 作为一种倒退。做 只是 except: 因为那会接住 SystemExit KeyboardInterrupt 也。

    编辑:我想说的是,你发现了它应该抛出的错误。如果它抛出了其他东西,可能是因为urlib代码没有捕获到它应该捕获并包装在 URLError . 即使是stdlib也会错过一些简单的事情,比如 AttributeError . 吸引人的 例外 作为一个倒退(并记录它捕获的内容)将帮助您了解正在发生的事情,而不捕获 系统退出 键盘中断 .

        3
  •  15
  •   Steven Huwig    17 年前
    $ grep "raise" /usr/lib64/python/urllib2.py
    IOError); for HTTP errors, raises an HTTPError, which can also be
            raise AttributeError, attr
                    raise ValueError, "unknown url type: %s" % self.__original
            # XXX raise an exception if no one else should try to handle
            raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
            perform the redirect.  Otherwise, raise HTTPError if no-one
                raise HTTPError(req.get_full_url(), code, msg, headers, fp)
                    raise HTTPError(req.get_full_url(), code,
                raise HTTPError(req.get_full_url(), 401, "digest auth failed",
                    raise ValueError("AbstractDigestAuthHandler doesn't know "
                raise URLError('no host given')
                raise URLError('no host given')
                raise URLError(err)
            raise URLError('unknown url type: %s' % type)
            raise URLError('file not on local host')
                raise IOError, ('ftp error', 'no host given')
                raise URLError(msg)
                raise IOError, ('ftp error', msg), sys.exc_info()[2]
                raise GopherError('no host given')
    

    URLLIB2依赖项中也可能存在异常,或者由真正的错误引起的异常。

    最好通过自定义将所有未捕获的异常记录到文件中。 sys.excepthook . 这里的关键经验法则是 永远不要抓住你不打算改正的例外。 日志记录不是更正 . 所以不要仅仅为了记录它们就抓住它们。

        4
  •  1
  •   Eugene Morozov    17 年前

    您可以捕获所有异常并记录捕获的内容:

     import sys
     import traceback
     def formatExceptionInfo(maxTBlevel=5):
         cla, exc, trbk = sys.exc_info()
         excName = cla.__name__
         try:
             excArgs = exc.__dict__["args"]
         except KeyError:
             excArgs = "<no args>"
         excTb = traceback.format_tb(trbk, maxTBlevel)
         return (excName, excArgs, excTb)
     try:
         x = x + 1
     except:
         print formatExceptionInfo()
    

    (代码来自 http://www.linuxjournal.com/article/5821 )

    也读 documentation on sys.exc_info .

        5
  •  0
  •   Yuval Pruss    7 年前

    我捕捉到:

    httplib.HTTPException
    urllib2.HTTPError
    urllib2.URLError
    

    我相信这涵盖了包括套接字错误在内的所有内容。