Tôi đang viết một mô-đun và muốn có một hệ thống phân cấp ngoại lệ thống nhất cho các ngoại lệ mà nó có thể nêu ra (ví dụ: kế thừa từ một FooError
lớp trừu tượng cho tất cả các foo
ngoại lệ cụ thể của mô-đun). Điều này cho phép người dùng mô-đun nắm bắt những ngoại lệ cụ thể đó và xử lý chúng một cách rõ ràng, nếu cần. Nhưng nhiều trường hợp ngoại lệ được nêu ra từ mô-đun được nêu ra vì một số ngoại lệ khác; ví dụ: thất bại ở một số tác vụ vì OSError trên một tệp.
Những gì tôi cần là để bọc lại, ngoại lệ bắt được sao cho nó có một loại và thông điệp khác , để thông tin có sẵn hơn nữa trong hệ thống phân cấp lan truyền bởi bất cứ điều gì bắt được ngoại lệ. Nhưng tôi không muốn mất loại, tin nhắn và dấu vết ngăn xếp hiện có; đó là tất cả thông tin hữu ích cho ai đó đang cố gắng gỡ lỗi. Trình xử lý ngoại lệ cấp cao nhất là không tốt, vì tôi đang cố gắng trang trí ngoại lệ trước khi nó tiến xa hơn đến ngăn xếp lan truyền và trình xử lý cấp cao nhất đã quá muộn.
Điều này được giải quyết một phần bằng cách lấy foo
các loại ngoại lệ cụ thể của mô-đun của tôi từ loại hiện có (ví dụ class FooPermissionError(OSError, FooError)
), nhưng điều đó không làm cho việc bọc trường hợp ngoại lệ hiện tại trong một loại mới cũng như sửa đổi thông báo dễ dàng hơn.
Chuỗi PEP 3134 của Python và Tracebacks nhúng ngoại vi thảo luận về một thay đổi được chấp nhận trong Python 3.0 cho các đối tượng ngoại lệ của Chained, để chỉ ra rằng một ngoại lệ mới đã được đưa ra trong quá trình xử lý ngoại lệ hiện có.
Những gì tôi đang cố gắng làm có liên quan: Tôi cần nó cũng hoạt động trong các phiên bản Python trước đó và tôi cần nó không phải để xâu chuỗi, mà chỉ cho đa hình. Cách đúng đắn để làm điều này là gì?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> giải pháp này là từ một câu hỏi SO khác . Đây không phải là đẹp nhưng chức năng.