2009-01-19 25 views
6

Tôi đã thấy một số C++ lớp với một destructor quy định như sau:Tôi có nên thêm throw() vào các khai báo cho các trình phá hủy C++ không?

class someClass 
{ 
    public: 
     someClass(); 
     ~someClass() throw(); 
}; 

Đây có phải là một ý tưởng tốt?

Tôi nhận thức rõ ràng rằng các trình phá hủy không bao giờ nên ném ngoại lệ, nhưng điều này có thực sự ngăn cản tôi thoát khỏi các ngoại lệ trong các destructors của tôi không? Tôi không chắc chắn 100% những gì nó đảm bảo.

Tham chiếu: this recent question

Trả lời

7

Nó không ngăn bạn thoát khỏi các ngoại lệ từ trình phá hủy của bạn. Trình biên dịch sẽ vẫn cho phép bạn làm điều đó. Sự khác biệt là nếu bạn cho phép ngoại lệ thoát khỏi trình phá hủy đó, chương trình của bạn sẽ ngay lập tức gọi unexpected. Hàm đó gọi bất cứ số nào unexpected_handler trỏ đến, theo mặc định là terminate. Vì vậy, trừ khi bạn làm một cái gì đó để xử lý một ngoại lệ bất ngờ, chương trình của bạn chấm dứt, mà hoàn toàn không phải là một ý tưởng tồi. Sau khi tất cả, nếu ngoại lệ thực sự là bất ngờ, sau đó không thực sự bất cứ điều gì chương trình của bạn sẽ có thể làm để xử lý nó anyway.

Đây không phải là điều đặc biệt về destructors; các quy tắc tương tự áp dụng cho các đặc điểm ngoại lệ cho tất cả các phương thức.

3

Đó không phải là ý tưởng khủng khiếp. Nếu bạn ném vào dtor trong khi không có ngoại lệ được tuyên truyền, bạn sẽ hủy bỏ ngay lập tức cho phép bạn biết bạn đã quên để thực hiện một dtor không ném thực tế.

Nếu mặt khác, bạn để lại thông số ném ra, bạn sẽ chỉ biết về việc triển khai dtor xấu của bạn khi một ngoại lệ, trên thực tế, bị ném.

Các vấn đề liên quan