2012-02-11 7 views
8

일반적인 예외를 잡는 것이 파이썬에서 합리적입니까? isinstance()을 사용하여 적절하게 처리하기 위해 특정 유형의 예외를 감지합니까?Python에서 isinstance를 사용하여 특정 유형의 예외를 확인하는 것이 합리적입니까?

나는 시간 제한, NXDOMAIN 응답 등과 같은 것들을 예외로하는 dnspython 툴킷을 가지고 놀고있다. 이러한 예외는 dns.exception.DNSException의 서브 클래스이므로, 합리적인지 궁금하다. 또는 pythonic, 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 오류를 포착하는 것이 현명합니다. –