2009-03-04 43 views
11

Lợi ích của việc tuyên bố ngoại lệ có thể-ném từ một hàm C++ là gì? Nói cách khác, việc thêm từ khóa throw() thực sự làm gì?Lợi ích của việc hạn chế ném được phép bởi hàm C++ là gì?

Tôi đã đọc rằng khai báo hàm như void do_something() throw(); phải đảm bảo rằng không có ngoại lệ nào bắt nguồn từ hàm do_something(); tuy nhiên, điều này dường như không đúng với các chức năng được gọi là trong số do_something(), do đó làm cho nó trở thành một sự bảo đảm yếu.

Hãy phác thảo tính hữu ích (và các trường hợp sử dụng tốt nhất) của tính năng ngôn ngữ này.

Trả lời

22

Không ai giải thích điều này tốt hơn so với Sutter

http://www.ddj.com/architect/184401544

Phiên bản ngắn gọn là

  1. Không bao giờ viết một đặc tả ngoại lệ
  2. Trừ có thể là một sản phẩm nào một
+0

Cảm ơn liên kết này! – Narek

0

Về cơ bản, bằng cách tuyên bố chức năng với throw(); bạn nói với trình biên dịch rằng bạn đang một trăm nhất định phần trăm rằng chức năng là không sẽ ném bất kỳ trường hợp ngoại lệ, cho phép trình biên dịch để thực hiện một số tối ưu. Nếu chức năng của bạn ném một ngoại lệ anyway, bạn đang gặp rắc rối, vì nó rất có thể dẫn đến hành vi không xác định.

+2

nổi hành vi được xác định, thực sự: nó gọi là bất ngờ(). Hành vi kém hiệu quả, có, nhưng được xác định rõ. – MSalters

5

Tiêu chuẩn C++ yêu cầu hàm unexpected() được gọi nếu hàm cố gắng ném ngoại lệ không nằm trong danh sách ngoại lệ của nó. Mô tả ngắn về điều này từ MSDN có tại đây: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

Hầu hết các trình biên dịch không thực sự hỗ trợ tính năng C++ này.

+1

>> Hầu hết các trình biên dịch không thực sự hỗ trợ tính năng C++ này << - và ví dụ, xem trang tài liệu MSVC mà bạn trỏ đến ... –

1
void do_something() throw(); 

Đây là sự bảo đảm từ phía người thực hiện rằng chức năng sẽ không bao giờ ném ngoại lệ. Đó là những gì một khách hàng của hàm có thể mong đợi. Tuy nhiên, nó cũng có nghĩa là bất kỳ ngoại lệ nào được tạo ra ở đâu đó bên trong hàm được xử lý và không được trả về cho phụ huynh của do_something(). Xấu hổ về anh ta, những người lại throw - từ bên trong, vì không có gì sẽ ngăn anh ta ném. Điều này là do, việc ném từ bên trong một hàm với một đặc tả ngoại lệ trống tương đương với việc ném một ngoại lệ không được đề cập trong đặc tả và làm cho std::unexpected() được dự kiến ​​theo sau là chấm dứt chương trình.

BTW: Định nghĩa chung được chấp nhận về bảo đảm ngoại lệ mạnh là: Nếu hoạt động công khai không thành công vì lý do nào đó, ngoại lệ được ném và trạng thái của đối tượng không thay đổi (hoạt động nguyên tử).

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