2009-09-11 18 views
13

Tôi đã bắt đầu sử dụng ngoại lệ C++ một cách thống nhất, và bây giờ tôi muốn trình biên dịch (g ++) kiểm tra rằng không có "rò rỉ ngoại lệ". Các trang trí throw nên làm điều này, như const làm cho constness của phương pháp lớp học.Có sử dụng cho trang trí ném C++ không?

Vâng, không.

Sử dụng throw vẫn là tài liệu, nhưng thậm chí có thể gây nhầm lẫn nguy hiểm nếu người khác cho rằng chức năng không thể ném ngoại lệ khác so với các trường hợp được liệt kê trong tài liệu của nó.

Có thể g ++ bằng cách nào đó được thuyết phục để kiểm tra kỹ hơn, ví dụ: thực sự đảm bảo chức năng được trang trí là throw() sẽ không bao giờ ném bất cứ thứ gì.

Chỉnh sửa: Tìm thấy this question xử lý chủ đề rộng rãi.

+0

Câu hỏi tương tự ở đây: http://stackoverflow.com/questions/1037575/why-arent-exceptions-in-c-checked-by-the-compiler – Glen

Trả lời

15

Không kiểm tra thời gian biên dịch, nhưng trình biên dịch tuân thủ phải đảm bảo thời gian chạy.

Nếu một hàm ném bất kỳ thứ gì ngoài khai báo, thời gian chạy C++ sẽ gọi std :: unexpected, nếu tôi nhớ chính xác.

+0

Đó là của tôi hiểu biết quá. Tại sao bạn muốn nó làm như vậy tôi không có ý tưởng. Cá nhân tôi thấy 'GetFoo() // throws (std :: runtime_error)' hữu ích hơn nhiều so với tương đương chưa được chú giải - giống như gợi ý cho người dùng mã của tôi. –

+1

Chính xác. Vấn đề thực tế đối với việc kiểm tra thời gian biên dịch là hầu hết mã C++ hiện có không có đặc tả kỹ thuật ném. – MSalters

+8

Visual C++ 2008 không hỗ trợ tiêu chuẩn này. –

0

Tôi không biết liệu trình kiểm tra/trình biên dịch có thể thực hiện điều đó hay không. Có lẽ nó chỉ dễ dàng hơn để bình luận nó trong khai báo hàm. Vâng nó aint fool bằng chứng nhưng nếu mọi người thấy rằng có thể có một ngoại lệ ném hơn hầu hết mọi người sẽ quấn các cuộc gọi chức năng trong cố gắng và bắt.

//Can throw Exception 
GetFoo(); 
2

Về cơ bản, các đặc điểm ngoại lệ chỉ tốt như đặc điểm kỹ thuật ngoại lệ trống. Nếu không, tôi nghĩ rằng họ là một thử nghiệm thất bại. Xem phlipsy's answer lý do.

8

Tôi cũng khuyên bạn nên xem bài viết this về các đặc điểm ngoại lệ. Nó chỉ ra các vấn đề của C++ tính năng như:

  • Đó là một hệ thống kiểu bóng
  • sẽ kiểm tra trình biên dịch ném ngoại lệ duy nhất trong thời gian chạy
  • Các kích hoạt hành vi mặc định trong trường hợp của một ngoại lệ ném nhưng không quy định thường không sử dụng được và thường bị hiểu nhầm bởi các lập trình viên
Các vấn đề liên quan