Câu trả lời đơn giản, không bao giờ cho phép ngoại lệ từ một dtor!
Câu trả lời phức tạp. Bạn chỉ được thực sự đóng đinh nếu ngoại lệ thoát khỏi dtor trong khi một ngoại lệ khác đang hoạt động. Trường hợp bình thường cho điều này là khi bạn đã mở ngăn xếp từ một ngoại lệ khác và đối tượng được đề cập bị hủy. Trong trường hợp đó, nếu ngoại lệ thoát khỏi dtor thì std::terminate
được gọi, lưu ý rằng bạn có thể đặt trong trình xử lý của riêng bạn cho std::terminate
bằng cách gọi std::set_terminate
. Việc triển khai mặc định là std::terminate
là để hủy cuộc gọi.
Để những điều phức tạp hơn, hầu hết các chức năng mà muốn thực hiện bất kỳ sự bảo đảm về an toàn ngoại lệ của họ, chủ yếu là đảm bảo cơ bản hoặc giấy cam kết mạnh mẽ, dựa trên các loại cơ bản để bản thân không ném vào dtor của họ *
Các thực câu hỏi là, chương trình của bạn sẽ ở trạng thái nào khi lỗi này xảy ra? Làm thế nào bạn có thể phục hồi? Việc phục hồi này sẽ được xử lý ở đâu? Bạn cần phải xem xét trường hợp cụ thể của bạn và làm việc những vấn đề này ra ngoài. Đôi khi nó là tốt để bắt ngoại lệ và bỏ qua nó. Lần khác bạn cần phải nâng cao một số lá cờ đỏ.
Vì vậy, câu trả lời là: nó cho phép bởi C++ để ném một ngoại lệ trong một dtor, nhưng bạn không bao giờ nên cho phép nó trốn thoát.
* Dưới đây là một tóm tắt synopsis của người nhận bảo lãnh ngoại lệ (đây là một lâu hơn nữa article)
- Tóm tắt: Tóm lại xác định đảm bảo Abrahams an toàn ngoại lệ (cơ bản, mạnh mẽ, và nothrow).
Việc bảo lãnh cơ bản là thất bại hoạt động có thể thay đổi trạng thái chương trình, nhưng không có rò rỉ xảy ra và ảnh hưởng đối tượng/modules vẫn còn phá hủy và có thể sử dụng, trong một phù hợp (nhưng không nhất thiết phải dự đoán được ) nhà nước.
Việc bảo lãnh mạnh mẽ liên quan đến giao dịch cam/rollback ngữ nghĩa: thất bại trong hoạt động đảm bảo chương trình nhà nước là không thay đổi với đối với các đối tượng hoạt động trên. Điều này có nghĩa là không có tác dụng phụ nào ảnh hưởng đến đối tượng, kể cả giá trị hoặc nội dung của các đối tượng trợ giúp có liên quan chẳng hạn như các trình vòng lặp trỏ vào các vùng chứa đang được thao tác.
Đảm bảo không đảm bảo nghĩa là các thao tác không thành công sẽ không xảy ra. Các hoạt động sẽ không ném một ngoại lệ.
Nguồn
2009-07-27 18:06:40
Chỉ để làm rõ, bạn có hỏi liệu nó có ổn không nếu destructor bắt được ngoại lệ, vì vậy nó không bao giờ rời khỏi destructor, hoặc nếu nó là ok để cho nó rời khỏi destructor miễn là nó bị bắt bên ngoài? – jalf
Tôi đang hỏi liệu có OK không nếu ngoại lệ nằm trong D'tor. –