2012-02-11 34 views
8

Có hợp lý trong Python để bắt ngoại lệ chung, sau đó sử dụng isinstance() để phát hiện loại ngoại lệ cụ thể để xử lý nó một cách thích hợp?Có hợp lý trong Python để kiểm tra một loại ngoại lệ cụ thể bằng cách sử dụng isinstance không?

Tôi đang chơi xung quanh với bộ công cụ dnspython tại thời điểm này, có một loạt ngoại lệ cho những thứ như thời gian chờ, phản hồi NXDOMAIN, v.v ... Các ngoại lệ này là các lớp con của dns.exception.DNSException, vì vậy tôi tự hỏi liệu nó có hợp lý hay không, hoặc pythonic, để bắt DNSException, sau đó kiểm tra ngoại lệ cụ thể với isinstance().

ví dụ:

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" 

Tôi mới dùng Python nên nhẹ nhàng!

Trả lời

16

Đó là những gì nhiều except khoản dành cho:

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" 

Hãy cẩn thận về thứ tự của các mệnh đề: Mệnh đề phù hợp đầu tiên sẽ được thực hiện, vì vậy chuyển đoạn kiểm tra cho lớp cha đến cùng.

+0

Cảm ơn Sven ... trông đẹp hơn nhiều. – Vortura

1

Từ dns.resolver, bạn có thể nhập một số ngoại lệ. (mã chưa được kiểm tra)

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 với câu trả lời: nếu các ngoại lệ được biết, tốt hơn nên sử dụng các khối 'trừ' khác nhau. Nhưng cuối cùng 'ngoại trừ dns.resolver.DNSException' sẽ là khôn ngoan, để xử lý các trường hợp ngoại lệ mà không cần xử lý cụ thể (hoặc để đảm bảo nắm bắt tất cả các lỗi dns). –

Các vấn đề liên quan