2012-02-11 2 views
8

一般的な例外をキャッチすることはPythonでは妥当ですか?isinstance()を使用して、それを適切に処理するために特定のタイプの例外を検出しますか?Pythonでは、isinstanceを使用して特定のタイプの例外をチェックすることは妥当ですか?

私はタイムアウト、NXDOMAINレスポンスなどのための例外の範囲を持っている現時点ではdnspythonツールキットで遊んでいます。これらの例外はdns.exception.DNSExceptionのサブクラスですので、妥当かどうか、またはDNSExceptionをキャッチして、isinstance()で特定の例外をチェックしてください。

try: 
    answers = dns.resolver.query(args.host) 
except dns.exception.DNSException as e: 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     print "No such domain %s" % args.host 
    elif isinstance(e, dns.resolver.Timeout): 
     print "Timed out while resolving %s" % args.host 
    else: 
     print "Unhandled exception" 

私はPythonに慣れ親しんでいます。

try: 
    answers = dns.resolver.query(args.host) 
except dns.resolver.NXDOMAIN: 
    print "No such domain %s" % args.host 
except dns.resolver.Timeout: 
    print "Timed out while resolving %s" % args.host 
except dns.exception.DNSException: 
    print "Unhandled exception" 

が句の順序に注意してください:最初に一致する句が取られるので、最後にスーパークラスのチェックを移動するために複数のexcept節があるものだ

答えて

16

+0

ありがとうございました。 – Vortura

1

dns.resolverからいくつかの例外をインポートできます。 (未テストコード)

from dns.resolver import Resolver, NXDOMAIN, NoNameservers, Timeout, NoAnswer 

try 
    host_record = self.resolver.query(self.host, "A") 
    if len(host_record) > 0: 
     Mylist['ERROR'] = False 
     # Do something 

except NXDOMAIN: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NXDOMAIN 
except NoNameservers: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NoNameservers 
except Timeout: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = Timeout 
except NameError: 
    Mylist['ERROR'] = True 
    Mylist['ERRORTYPE'] = NameError 
+0

+1答え:例外が分かっている場合は、別の 'except'ブロックを使うのが良いでしょう。しかし、最後の 'dns.resolver.DNSException'を除いて、特定の処理なしでサブ例外を処理する(またはすべてのdnsエラーを確実に捕らえる)ことが賢明です。 –

関連する問題