Trong khi thiết kế thư viện C ++ 'nghiêm túc' đầu tiên của mình, tôi tự hỏi:
Đó có phải là phong cách tốt để rút ra những ngoại lệ từ std::exception
đó và đó là kết quả?!
Ngay cả sau khi đọc
Tôi vẫn không chắc chắn. Bởi vì, bên cạnh thực tiễn thông thường (nhưng có thể không tốt), tôi cho rằng, với tư cách là người sử dụng thư viện, chức năng thư viện sẽ chỉ ném std::exception
khi chức năng thư viện tiêu chuẩn thất bại trong việc triển khai thư viện và nó không thể làm gì được. Tuy nhiên, khi viết mã ứng dụng, đối với tôi, nó rất thuận tiện và IMHO cũng rất đẹp mắt std::runtime_error
. Ngoài ra người dùng của tôi cũng có thể dựa vào giao diện tối thiểu được xác định, như what()
hoặc mã.
Và ví dụ, người dùng của tôi cung cấp các đối số bị lỗi, điều gì sẽ thuận tiện hơn là ném một cái std::invalid_argument
, phải không? Vì vậy, kết hợp với việc sử dụng phổ biến của std :: ngoại lệ tôi thấy trong mã khác: Tại sao không đi xa hơn và xuất phát từ lớp ngoại lệ tùy chỉnh của bạn (ví dụ lib_foo_exception) và cũng từ std::exception
.
Suy nghĩ?
lib_foo_exception
lớp của tôi xuất phát std::exception
, người dùng thư viện sẽ bắt lib_foo_exception
bằng cách chỉ bắt std::exception
, ngoài ra khi anh ta chỉ bắt được người duy nhất. Vì vậy, tôi cũng có thể hỏi lớp thư viện ngoại lệ thư viện của tôi có nên kế thừa từ std :: ngoại lệ không .
lib_foo_exception
?" Với kế thừa từ std::exception
bạn có thể làm điều đó bằng cách catch(std::exception)
OR catch(lib_foo_exception)
. Không xuất phát từ std::exception
, bạn sẽ bắt nó nếu và chỉ khi , bởi catch(lib_foo_exception)
.
catch(...)
. Đó là bởi vì ngôn ngữ cho phép trong trường hợp bạn đang xem xét (và cho các thư viện "hoạt động sai"), nhưng đó không phải là cách thực hành tốt nhất hiện đại.
catch
các trang web thô hơn, tổng quát hơn và các giao dịch thô hơn tương tự mô hình hóa hoạt động của người dùng. Nếu bạn so sánh nó với các ngôn ngữ không thúc đẩy ý tưởng bắt chung chung std::exception&
, ví dụ, chúng thường có nhiều mã hơn với các try/catch
khối trung gian liên quan đến các lỗi rất cụ thể, điều này phần nào làm giảm tính tổng quát của việc xử lý ngoại lệ khi nó bắt đầu diễn ra nhấn mạnh hơn nhiều vào việc xử lý lỗi thủ công và cả các lỗi khác nhau có thể xảy ra.
std::exception
không có nghĩa là bạn ném astd::exception
. Ngoài ra,std::runtime_error
không kế thừa từstd::exception
nơi đầu tiên, vàwhat()
phương pháp đến từstd::exception
, khôngstd::runtime_error
. Và bạn chắc chắn nên tạo các lớp ngoại lệ của riêng bạn thay vì ném các ngoại lệ chung chung nhưstd::runtime_error
.