2009-03-20 4 views
51

リモートURLへのポストバックを行う次のコードがあります。urllib2.Request/urlopenで処理する必要のあるエラー/例外は何ですか?

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を使用するロガーです。

リモートサーバーがダウンしてコードが終了したときにこのコードが実行されるという問題がありました(これは顧客のサーバー上にあり、この時点で出口スタックのダンプ/エラーが何であるか分かりません)。私は、これが処理されていない例外および/またはエラーがあるためだと仮定しています。それで、私が上で扱っていないと思われる他の例外はありますか?

答えて

50

は、一般的な例外ハンドラを追加します。

+0

は 'checksLogger.error'あなたの例ではユーザ定義関数ですか? – codingknob

+1

@ algotr8der:ええ、それはちょうど質問にログインするのcopy'n'Pasteです – vartec

+0

大丈夫です。ありがとうございました。 – codingknob

1

あなたはすべての例外をキャッチし、捕まる何ログインすることができます:

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をお読みください。

+0

「例外を除く:」を使用すると、例外ハンドラで問題を引き起こす可能性のあるエラーをキャッチしない方がよいでしょう。 –

+0

あなたがただログをとっているなら、例外を一切捕まえないほうがいいです - 私の答えを見てください。 –

+0

@ S.Lott:ありがとう、それは私が慣れていないトリックです –

15

docs pageurlopenのエントリから、URLErrorをキャッチする必要があるようです。あなたが実際にurllibコード内の問題に対してあなたの賭けを賭けたい場合は、Exceptionをフォールバックとしてキャッチすることもできます。 となります。except:は、SystemExitKeyboardInterruptもキャッチします。

編集:私が言っていることは、あなたが投げたと思われるエラーをキャッチしているということです。それが何かを投げているのであれば、おそらくurllibコードがキャッチしてURLErrorにラップしておくべきものをキャッチしていないことが原因です。 stdlibでさえ、AttributeErrorのような単純なものを見逃しがちです。 Exceptionをフォールバックとして捕捉して(捕捉したものをログに記録する)、SystemExitKeyboardInterruptをトラップすることなく、何が起きているのか把握するのに役立ちます。

+1

+1のドキュメントへのリンク、および例外のクリーンアドバイス –

+3

+1は私にexceptの違いを教えてくれます:Exception(少なくとも1つは例外です) 。 – hyperboreean

+0

urllib2.URLError以外はどうですか、e:まだURLErrorを捕まえていませんか? – DavidM

13

また、urllib2の依存関係、または本物のバグによる例外が発生する可能性があります。

カスタムsys.excepthookを経由してファイル内のすべてのキャッチされない例外をログオフ最高です。 ここで親指のキールールは、あなたがを修正することを計画されていない例外をキャッチすることはありませんにあり、そしてロギングが補正ではありません。ログだけを捕まえないでください。私はキャッチ

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



httplib.HTTPException
urllib2.HTTPError
urllib2.URLError

私は、これはソケットエラーを含むすべてをカバー信じる

+2

'urllib2.HTTPError'は' urllib2.URLError'のサブクラスなので、 2番目は十分です – pictuga

+1

これらのどれもcatchしませんsocket.error –

関連する問題