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:
그 잡을 것 때문에, SystemExit
및 KeyboardInterrupt
도.
편집 : 내가 말하려는 것은 던져야 할 오류를 포착하고 있다는 것입니다. 다른 것을 던지는 경우 urllib 코드가 URLError
. stdlib조차도 AttributeError
. 잡기 Exception
가을 백으로 (그리고 잡힌 것을 로깅) 트래핑없이, 당신은 무슨 일이 일어나고 있는지 알아내는 데 도움이됩니다 SystemExit
및 KeyboardInterrupt
.
$ 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.
'development' 카테고리의 다른 글
문자열 일치 후 단어를 가져 오는 정규식 (0) | 2020.12.12 |
---|---|
파일 또는 폴더를 놓기 전에 끌고 있는지 구별하는 방법은 무엇입니까? (0) | 2020.12.12 |
여러 서버의 단일 SSL 인증서 (0) | 2020.12.12 |
Linux 패키지 저장소의 * -dev 패키지에는 실제로 무엇이 포함되어 있습니까? (0) | 2020.12.12 |
Android HttpURLConnection을 사용하여 HTTP 가져 오기 (0) | 2020.12.11 |