development

urllib2.Request / urlopen으로 처리해야하는 오류 / 예외는 무엇입니까?

big-blog 2020. 12. 12. 12:06
반응형

urllib2.Request / urlopen으로 처리해야하는 오류 / 예외는 무엇입니까?


원격 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')

postBackData는 urllib.urlencode를 사용하여 인코딩 된 사전을 사용하여 생성됩니다. checksLogger는 logging을 사용하는 로거 입니다.

원격 서버가 다운되고 코드가 종료 될 때이 코드가 실행되는 문제가 발생했습니다 (고객 서버에 있으므로 현재 종료 스택 덤프 / 오류가 무엇인지 알 수 없습니다). 처리되지 않는 예외 및 / 또는 오류가 있기 때문이라고 생각합니다. 그렇다면 위에서 처리하지 않은 다른 예외가 트리거 될 수 있습니까?


일반 예외 처리기를 추가합니다.

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())

로부터 문서 페이지 urlopen 당신은 그냥 잡을 필요가 같은 항목이 보인다 URLError을 . urllib 코드 내의 문제에 대한 베팅을 정말로 헤지하고 싶다면 Exception, 폴백으로 잡을 수도 있습니다 . 수행 하지except:그 잡을 것 때문에, SystemExitKeyboardInterrupt도.

편집 : 내가 말하려는 것은 던져야 할 오류를 포착하고 있다는 것입니다. 다른 것을 던지는 경우 urllib 코드가 URLError. stdlib조차도 AttributeError. 잡기 Exception가을 백으로 (그리고 잡힌 것을 로깅) 트래핑없이, 당신은 무슨 일이 일어나고 있는지 알아내는 데 도움이됩니다 SystemExitKeyboardInterrupt.


$ 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')

There is also the possibility of exceptions in urllib2 dependencies, or of exceptions caused by genuine bugs.

You are best off logging all uncaught exceptions in a file via a custom sys.excepthook. The key rule of thumb here is to never catch exceptions you aren't planning to correct, and logging is not a correction. So don't catch them just to log them.


You can catch all exceptions and log what's get caught:

 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()

(Code from http://www.linuxjournal.com/article/5821)

Also read documentation on sys.exc_info.


I catch:

httplib.HTTPException
urllib2.HTTPError
urllib2.URLError

I believe this covers everything including socket errors.

참고URL : https://stackoverflow.com/questions/666022/what-errors-exceptions-do-i-need-to-handle-with-urllib2-request-urlopen

반응형