2010-05-16 44 views
14

Có tham khảo về ngoại lệ của Thư viện chuẩn C++ không? Tôi chỉ muốn biết rằng các chức năng nào có thể ném một ngoại lệ hay không.Danh sách ngoại lệ của thư viện chuẩn C++?

+0

Related: http://stackoverflow.com/questions/11938979/what-exception-classes-are-in-the-standard-c-library –

Trả lời

19

Thực ra, hầu hết chức năng thư viện chuẩn không tự ném ngoại lệ. Họ chỉ vượt qua ngoại lệ do mã người dùng gọi ra. Ví dụ: nếu bạn push_back() một phần tử cho vectơ, điều này có thể ném (do lỗi phân bổ bộ nhớ và) nếu trình tạo bản sao của đối tượng ném.

Một vài trường hợp ngoại lệ đáng chú ý (không ý định chơi chữ), nơi các chức năng thư viện ném là:

  • Một số phương pháp sẽ ném out_of_range nếu chỉ số cung cấp không hợp lệ:
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set(), reset()flip().
  • Một số phương pháp sẽ ném std::overflow_error về tràn số nguyên:
    • std::bitset<>::to_ulong() và (C++ 0x) to_ullong().
  • std::allocator<T> sẽ chuyển qua số std::bad_alloc được ném bởi new mà nó gọi.
  • Luồng có thể được thiết lập sao cho std::ios_base::failure được ném khi bit trạng thái được đặt.
  • phân bổ mảng lớn có thể ném std::bad_array_new_length
  • dynamic_cast trên một tài liệu tham khảo có thể ném một std::bad_cast (về mặt kỹ thuật không nằm trong các thư viện chuẩn)
  • Ném một ngoại lệ không hợp lệ từ một hàm với một đặc điểm kỹ thuật ngoại lệ sẽ ném một std::bad_exception
  • Gọi số std::function::operator(...) nếu không có giá trị sẽ ném std::bad_function_call.
  • Sử dụng typeinfo của con trỏ rỗng có thể ném std::bad_typeid.
  • Truy cập weak_ptr sau khi điểm phát hành đã được phát hành sẽ ném std::bad_weak_ptr.
  • Sử dụng không chính xác std::promise/std::future có thể ném std::future_error.
  • (C++ 11) Các chức năng chuỗi chuyển đổi std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stodstd::stold có thể ném cả std::invalid_argumentstd::out_of_range.
  • (C++ 11) Trong gia đình regex, các nhà thầu và phương pháp chỉ định có thể ném std::regex_error.

(Tôi đang làm cho một câu trả lời CW, vì vậy nếu có ai có thể nghĩ nhiều như vậy, xin vui lòng thêm chúng ở đây.)

Ngoài ra, đối với phiên bản thứ 3 của C++ Programming Language, Bjarne Stroustrup có thể tải xuống appendix about exception safety, có thể có liên quan.

+0

+1 cho liên kết. Tôi mới bắt đầu đọc nó. –

+0

Cảm ơn câu trả lời của bạn. Nhân tiện, câu trả lời của CW là gì? – Brian

+0

@Brian: Đó là "wiki cộng đồng". Những người khác được tự do chỉnh sửa bất kỳ câu trả lời CW nào (ngay cả khi họ không có đại diện để chỉnh sửa câu trả lời bình thường). – sbi

1

Các chức năng duy nhất được bảo đảm (bởi trình biên dịch) để không ném là chức năng mà có đặc điểm kỹ thuật throw() ngoại lệ, như thế này:

void ThisFunctionNeverThrows() throw() 
{ 
} 

Nếu không, bất kỳ chức năng khác có khả năng có thể ném một ngoại lệ, trừ khi họ là đặc biệt tài liệu khác. Bạn phải xem xét sự an toàn ngoại lệ khi viết mã khi đối mặt với ngoại lệ.

Xem bài viết của Bjarne Stroustup về an toàn ngoại lệ và thư viện chuẩn: http://www2.research.att.com/~bs/3rd_safe.pdf Bắt đầu từ trang 19 trong tệp PDF, bạn có thể tìm thấy thông tin về các đảm bảo được thực hiện bởi các thùng chứa tiêu chuẩn.

+0

Điều này không đúng với nhiều vùng chứa, ví dụ: đảm bảo không ném vào 'erase()', nhưng hàm này không phải là 'throw()'. Từ quan điểm ngôn ngữ, những gì bạn viết có ý nghĩa, nhưng có những sự bảo đảm khác với những gì được thực thi bởi trình biên dịch. – doublep

+0

@doublep: 'erase()' * sẽ * ném nếu hàm tạo bản sao của loại phần tử ném. – kennytm

+0

Từ trang 21 trong tệp PDF tôi đã đề cập (Bảo đảm cho 'vector' và' deque'): "Trừ khi được tạo bởi hàm tạo bản sao hoặc toán tử gán của kiểu phần tử, không có' xoá() 'ném ngoại lệ." –

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