2010-10-02 44 views
24

Tôi đang làm việc trên thư viện gửi thư và tôi muốn có thể nắm bắt các ngoại lệ do người gửi tạo (SMTP, Google AppEngine, v.v.) và đưa chúng vào các ngoại lệ dễ bắt được cụ thể với thư viện (ConnectionError, MessageSendError, vv), với nguyên gốc traceback nguyên vẹn để nó có thể được gỡ lỗi. Cách tốt nhất để làm điều này trong Python 2 là gì?Trường hợp ngoại lệ trong Python

Trả lời

24

Cách đơn giản nhất là làm nổi bật với đối tượng dấu vết cũ. Ví dụ sau đây cho thấy điều này:

import sys 

def a(): 
    def b(): 
     raise AssertionError("1") 
    b() 

try: 
    a() 
except AssertionError: # some specific exception you want to wrap 
    trace = sys.exc_info()[2] 
    raise Exception("error description"), None, trace 

Kiểm tra tài liệu của raise statement để biết chi tiết về ba thông số. ví dụ của tôi sẽ in:

Traceback (most recent call last): 
    File "C:\...\test.py", line 9, in <module> 
    a() 
    File "C:\...\test.py", line 6, in a 
    b() 
    File "C:\...\test.py", line 5, in b 
    raise AssertionError("1") 
Exception: error description 

Để hoàn chỉnh, bằng Python 3 bạn muốn sử dụng raise MyException(...) from esyntax.

+1

'tăng ngoại lệ (" mô tả lỗi "), Không, dấu vết' có tác dụng phụ của việc mất thông báo lỗi gốc. Có ai biết cách này không? –

+1

Tôi đã kết thúc bằng cách sử dụng thư từ ngoại lệ ban đầu và nối nó vào thư mới. –

+2

Tôi làm như sau: 'Tăng ngoại lệ (" mô tả lỗi \ nĐược gửi bởi: {}: {} ". Định dạng (loại (e) .__ name__, str (e))), Không, sys.exc_info() [2 ] ' –

1

Câu trả lời này có thể hơi trễ một chút, nhưng bạn có thể bọc chức năng theo số python decorator.

Dưới đây là một đơn giản cheatsheet về cách trang trí khác nhau.

Dưới đây là một số mã mẫu về cách thực hiện việc này. Chỉ cần thay đổi decorator để bắt các lỗi khác nhau theo các cách khác nhau mà bạn cần.

def decorator(wrapped_function): 
    def _wrapper(*args, **kwargs): 
     try: 
      # do something before the function call 
      result = wrapped_function(*args, **kwargs) 
      # do something after the function call 
     except TypeError: 
      print("TypeError") 
     except IndexError: 
      print("IndexError") 
     # return result 
    return _wrapper 


@decorator 
def type_error(): 
    return 1/'a' 

@decorator 
def index_error(): 
    return ['foo', 'bar'][5] 


type_error() 
index_error() 
Các vấn đề liên quan