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
24
A
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 e
syntax.
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
- 1. Python: trường hợp ngoại lệ trong tập
- 2. Ngoại lệ trong các trường hợp ngoại lệ trong C++
- 3. Mã lỗi trong trường hợp ngoại lệ so với trường hợp ngoại lệ hierarhy
- 4. Trường hợp ngoại lệ trong Yesod
- 5. ASP.NET MVC - Trường hợp ném ngoại lệ?
- 6. Trường hợp ngoại lệ của DataContext
- 7. after_filter cho trường hợp ngoại lệ
- 8. django - bắt nhiều trường hợp ngoại lệ
- 9. Loại ngoại lệ nào để ném trong trường hợp này?
- 10. Tiêu hủy temporaries chuỗi trong trường hợp ngoại lệ ném
- 11. Bắt số dòng trong trường hợp ngoại lệ ruby
- 12. Chu kỳ trong trường hợp ngoại lệ bị xích
- 13. tuyên bố ngoại lệ không được self.assertRaises trong trường hợp kiểm tra đơn vị python
- 14. Chuỗi ngoại lệ Python
- 15. Cách thích hợp để tăng ngoại lệ trong python?
- 16. Các trường hợp ngoại lệ là bao nhiêu Tiền mặt
- 17. HttpClient - đối phó với trường hợp ngoại lệ tổng
- 18. Trường hợp ngoại lệ khi sử dụng Xamarin Android
- 19. ExceptionValidationRule không phản ứng với trường hợp ngoại lệ
- 20. log4j không in stacktrace cho trường hợp ngoại lệ
- 21. Trường hợp ngoại lệ AutoReconnect "đã thay đổi"
- 22. Bắt tất cả ngoại lệ trong Python
- 23. Trường hợp ngoại lệ kết nối Android http
- 24. Trường hợp và cách xử lý các trường hợp ngoại lệ mùa xuân + hibernate?
- 25. Python MySQLdb ngoại lệ
- 26. xử lý ngoại lệ python
- 27. Phương pháp in Python ngoại lệ thích hợp là gì?
- 28. Xử lý ngoại lệ Python
- 29. exePath là ngoại lệ không hợp lệ trong ConfigurationManager.OpenExeConfiguration
- 30. python nhắn ngoại lệ chụp
'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? –
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. –
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 ] ' –