Một cách thực sự tốt hơn sẽ là tạo một lớp (hoặc các lớp) cho các trường hợp ngoại lệ.
Cái gì đó như:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
Lý do là các ngoại lệ thích hợp hơn nhiều so với việc chỉ chuyển một chuỗi. Cung cấp các lớp khác nhau cho các lỗi, bạn cho nhà phát triển cơ hội để xử lý một lỗi cụ thể theo cách tương ứng (không chỉ hiển thị thông báo lỗi). Những người bắt được ngoại lệ của bạn có thể cụ thể như họ cần nếu bạn sử dụng hệ thống phân cấp.
a) Người ta có thể cần biết lý do cụ thể
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
a) người khác không muốn biết chi tiết
} catch (const std::exception & ex) {
Bạn có thể tìm thấy một số cảm hứng về chủ đề này trong https://books.google.ru/books?id=6tjfmnKhT24C Chương 9
Ngoài ra, bạn có thể cung cấp một thông báo tùy chỉnh quá, nhưng phải cẩn thận - nó không phải là an toàn để soạn một tin nhắn với một trong hai std::string
hoặc std::stringstream
hoặc bất kỳ cách nào khác có thể gây ra một ngoại lệ .
Nói chung, không có sự khác biệt cho dù bạn cấp phát bộ nhớ (làm việc với chuỗi theo cách C ++) trong phương thức khởi tạo của ngoại lệ hay ngay trước khi ném - std::bad_alloc
ngoại lệ có thể được ném trước ngoại lệ mà bạn thực sự muốn.
Vì vậy, một bộ đệm được phân bổ trên ngăn xếp (như trong câu trả lời của Maxim) là một cách an toàn hơn.
Nó được giải thích rất tốt tại http://www.boost.org/community/error_handling.html
Vì vậy, cách tốt hơn sẽ là một loại ngoại lệ cụ thể và tránh soạn chuỗi được định dạng (ít nhất là khi ném).
std∷exception
không có hàm tạo nào vớichar*
arg.