2015-10-19 16 views
5

Tôi đã tự hỏi nếu bạn có thể tái nâng cao một ngoại lệ bắt buộc (cụ thể) và bị nó bắt sau (chung) ngoại trừ trong cùng một lần thử ngoại trừ. Ví dụ, tôi muốn làm một cái gì đó với một IOError cụ thể, nhưng nếu nó không phải là IOError mong đợi thì ngoại lệ nên được xử lý giống như bất kỳ lỗi nào khác. Những gì tôi ban đầu đã cố gắng:Python 'ngoại trừ' mùa thu thông qua

try: 
    raise IOError() 
except IOError as ioerr: 
    if ioerr.errno == errno.ENOENT: 
     # do something with the expected err 
    else: 
     # continue with the try-except - should be handled like any other error 
     raise 
except Exception as ex: 
    # general error handling code 

Tuy nhiên, điều này không làm việc: các tăng tái tăng ngoại trừ bên ngoài bối cảnh của lần thử-trừ. Điều gì sẽ là cách viết của pythonic này để có được ngoại lệ mong muốn 'hành vi' thông qua '?

(tôi biết có một đề xuất 'có điều kiện ngoại trừ' mà không được thực hiện, có thể đã giải quyết này)

+1

Vì vậy, bạn muốn có thể chuyển từ khối 'ngoại trừ IOError' sang khối' ngoại lệ '? Theo tôi biết là không thể, chỉ có một khối 'except' (hoặc khối' else' khác) chạy cho 'try' đã cho. Bạn có thể bọc toàn bộ thứ trong một 'try' khác, loại bỏ bên trong' ngoại trừ ngoại lệ ', điều đó có nghĩa là tất cả, nhưng 'IOError' được xử lý đặc biệt kết thúc trong' try''s 'except'. – jonrsharpe

+0

Đây là những gì tôi muốn làm, và tôi đã lo lắng rằng chỉ có duy nhất một ngoại trừ là có thể. Tôi hy vọng cho một giải pháp thanh lịch hơn mà một cái gì đó giống như lồng nhau/mã trùng lặp – OverlordAlex

Trả lời

1

Tôi không phải là một chuyên gia bằng văn bản pythonically, nhưng tôi nghĩ một cách tiếp cận rõ ràng (nếu bạn biết rằng bạn đang mong đợi một loại ngoại lệ cụ thể), sẽ sử dụng xử lý ngoại lệ lồng nhau:

try: 
    try: 
     raise IOError() 
    except IOError as ioerr: 
     if ioerr.errno == errno.ENOENT: 
      # do something with the expected err 
     else: 
      # pass this on to higher up exception handling 
      raise 

except Exception as ex: 
    # general error handling code 

Tôi biết trong nhận xét của bạn rằng bạn không muốn lồng nhau - Tôi không biết nếu xử lý ngoại lệ lồng nhau là xấu trong cuốn sách của bạn, nhưng ít nhất bạn có thể tránh trùng lặp mã.

+0

Đây là một cách tiếp cận tuyệt vời, nó thực sự có vẻ hiển nhiên khi bạn đã nhìn thấy nó. Ý tưởng rất hay! – iFreilicht

1

Vì vậy, tôi đang làm việc trên cùng ở đây, và sau khi xem xét các giải pháp có sẵn, tôi sẽ đi với bắt ngoại lệ cha mẹ, và sau đó thử nghiệm cho chi tiết cụ thể. Trong trường hợp của tôi, tôi đang làm việc với mô-đun dns.

try: 
    answer = self._resolver.query(name, 'NS') 
except dns.exception.DNSException, e: #Superclass of exceptions tested for 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     #Do Stuff 
    elif isinstance(e, dns.resolver.NoAnswer): 
     # Do other stuff 
    else: 
     # Do default stuff 
Các vấn đề liên quan