2009-03-02 32 views
8

tôi đang đọc trang này http://www.cplusplus.com/doc/tutorial/exceptions.html nó nói nếu tôi viết hàm() throw(); không có ngoại lệ nào có thể được ném vào hàm đó. Tôi đã cố gắng trong msvc 2005 viết throw(), ném (int), throw() và không có gì cả. mỗi kết quả có cùng một kết quả chính xác. Không có gì. Tôi ném int, char *, một loại khác và tất cả đều bị bắt theo cùng một cách. Dường như ném không ảnh hưởng đến nó cả. Hàm function() throw() thực sự làm gì?về ngoại lệ C++. func() throw()

Trả lời

10

Xem this article biết chi tiết về thông số kỹ thuật C++ ngoại lệ và của Microsoft thực hiện:

Microsoft Visual C++ 7.1 bỏ qua chi tiết kỹ thuật ngoại lệ, trừ khi họ là những sản phẩm nào. Thông số kỹ thuật ngoại lệ trống tương đương với __declspec(nothrow) và chúng có thể giúp trình biên dịch giảm kích thước mã.

[...] Nếu nó thấy thông số ngoại lệ trống, nó sẽ cho bạn biết bạn đang làm gì và tối ưu hóa cơ chế để xử lý ngoại lệ. Nếu chức năng của bạn ném anyway - tốt, xấu hổ về bạn. Chỉ sử dụng tính năng này nếu bạn là 100% tích cực chức năng của bạn không ném và sẽ không bao giờ.

+0

Điều đó rất khác so với tiêu chuẩn nói ... Tôi đoán một lý do khác không sử dụng chúng –

+0

Cảm ơn bạn đã chỉnh sửa, Shog;) –

0

Ném ngoại lệ là không đủ, bạn cần một khối try {} catch() để bắt ngoại lệ. Nếu bạn không bắt được ngoại lệ, std::terminate() sẽ được gọi và chương trình của bạn sẽ đột ngột xuất hiện. Hãy dành chút thời gian và đi theo số this.

+4

Đó không phải là những gì anh ta đang hỏi. –

0

thông số kỹ thuật ném được thiết kế cho hai mục đích:

  1. Để phục vụ như một hợp đồng giữa giao diện thực hiện và giao diện người dùng - bạn nêu mà trường hợp ngoại lệ có thể được throwned từ phương pháp của bạn, một số người coi đó là một phần của một giao diện . (hợp đồng) Ala đã kiểm tra ngoại lệ trong Java.

  2. Như một cách để báo hiệu các trình biên dịch mà nó có thể áp dụng tối ưu hóa nhất định trong trường hợp không có trường hợp ngoại lệ có thể được ném từ một phương pháp/thủ tục (thiết lập ngoại lệ chi phí xử lý một cái gì đó)

Ném một ngoại lệ không quy định trong throw() khoản là một sai lầm, tuy nhiên tại không có điểm là việc thực hiện cần thiết để xác minh nó cho bạn. Trong thực tế nó thậm chí không thể xác minh, vì nó bao gồm tất cả các ngoại lệ có thể có từ các chương trình con mà các chương trình con của bạn gọi. (có thể từ các mô-đun khác) Nó thậm chí không thể trong một mô-đun đơn lẻ, vì dễ dàng giảm xuống một vấn đề tạm dừng :)

+0

Hoàn toàn không chính xác cho C++. Các đặc tả ngoại lệ được yêu cầu phải được kiểm tra trong thời gian chạy, và chúng nói chung không cho phép tối ưu hóa. –

+0

Đó không phải là quan điểm của tôi. Chúng không bắt buộc phải được kiểm tra trong COMPILE-TIME. Chúng cũng cho phép tối ưu hóa trong trường hợp không có ngoại lệ (IMHO C++ Language FAQ đề cập đến nó). Vì vậy, phiếu bầu của bạn không chính xác. – EFraim

4

Điều bạn đang tìm kiếm là phiên bản VC++ đó không thực thi các ngoại lệ đặc tả. Tôi tin rằng đó là tài liệu như một sự khác biệt so với tiêu chuẩn.

Tuy nhiên, đặc điểm ngoại lệ thường không phải là một ý tưởng hay. Nếu một chương trình vi phạm chúng trong một thực hiện phù hợp tiêu chuẩn (mà VC + + từ VS 2005 không phải là trong trường hợp này), hệ thống được cho là bắt nó. Điều này có nghĩa rằng đặc điểm kỹ thuật không phải là một gợi ý tối ưu hóa trình biên dịch, mà là buộc trình biên dịch phải đi đến độ dài phụ, và đôi khi tạo ra mã tối ưu.

Xem the Boost rationale vì lý do tại sao dự án Tăng cường được đánh giá cao không sử dụng các đặc điểm ngoại lệ. Đây là Boost, đó là một cái gì đó của trẻ em poster để làm những điều kỳ lạ và hữu ích với các phần nâng cao của ngôn ngữ.

1

Trích dẫn từ A Pragmatic Look at Exception Specifications:

(Mis) hiểu biết

Vấn đề thứ hai đã làm với biết những gì bạn đang nhận được. Như nhiều người đáng chú ý, bao gồm các tác giả của Boost ngoại lệ đặc điểm kỹ thuật lý do, đã đặt nó, lập trình viên có xu hướng sử dụng ngoại lệ thông số kỹ thuật như thể họ cư xử cách các lập trình viên muốn, thay vì theo cách mà họ thực sự làm hoạt động.

Dưới đây là những gì mà nhiều người nghĩ rằng kỹ thuật ngoại lệ thực hiện:

Đảm bảo
  • rằng chức năng sẽ chỉ ném ngoại lệ được liệt kê (có thể không có).

  • Bật tối ưu hóa trình biên dịch dựa trên kiến ​​thức chỉ liệt kê ngoại lệ (có thể là không có) sẽ bị ném.

Những kỳ vọng ở trên, một lần nữa, gần như là chính xác.

Xem liên kết để biết chi tiết đầy đủ.