2015-07-13 13 views

Trả lời

16

throw mà không có một lý lẽ chỉ nên được sử dụng bên trong một tuyên bố catch, để rethrow đối tượng ngoại lệ bắt. Bạn mã cố gắng sử dụng nó bên ngoài tuyên bố catch - thay vào đó bạn nên chọn một loại để ném, nếu nghi ngờ nó không phải là không hợp lý để bắt đầu với std::runtime_error. Để có thêm tùy chọn, hãy xem here. Bạn cũng có thể ném các kiểu của riêng mình, nhưng thường là một ý tưởng tốt để lấy chúng từ một trong các kiểu được cung cấp bởi thư viện chuẩn, vì vậy mã khách hàng có cơ hội tốt hơn trong việc xác định xử lý thích hợp cho tất cả các lỗi tương tự về mặt logic, thay vì phải nắm bắt và xử lý chúng một cách riêng biệt và được cập nhật liên tục cho mỗi lỗi mới có thể xảy ra.

FWIW, chỉ số Standard nói trong 15,1/9:

Nếu không có ngoại lệ được hiện đang được xử lý, thực hiện một ném biểu hiện không có toán hạng gọi std::terminate().

Vì vậy, rất rõ ràng, câu trả lời cho "Cái gì được ném ..." là không thực hiện thao tác ném và thay vào đó, std::terminate được gọi.

+3

Điều này đúng nhưng có trả lời được câu hỏi không? Bạn nói đúng "đừng làm thế", nhưng không phải là câu hỏi "nếu tôi làm thế thì sao?" – hvd

+0

@hvd: đúng ... đã nhận được văn bản chính xác cùng nhau .... –

+0

Vâng, có vẻ tốt. :) – hvd

5

Câu hỏi đặt ra là: "Điều gì xảy ra khi tôi throw bên ngoài khối catch?" Câu trả lời cho câu hỏi này có thể được tìm thấy trong số documentation:

Trả lại ngoại lệ hiện được xử lý. Từ bỏ việc thực thi khối catch hiện tại và chuyển điều khiển cho trình xử lý ngoại lệ phù hợp tiếp theo (nhưng không cho một mệnh đề catch khác sau cùng khối try: câu lệnh ghép của nó được coi là 'exited'), sử dụng lại đối tượng ngoại lệ hiện có: không có vật thể mới nào được tạo ra. Biểu mẫu này chỉ được phép khi ngoại lệ hiện đang được xử lý (nó gọi là std :: chấm dứt nếu được sử dụng khác). Điều khoản bắt được liên kết với một khối chức năng thử phải thoát ra thông qua rethrowing nếu được sử dụng trên một constructor.

Làm nổi bật mỏ.

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