Cara yang lebih bagus adalah membuat kelas (atau kelas) untuk pengecualian.
Sesuatu seperti:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
Alasannya adalah bahwa pengecualian jauh lebih disukai daripada hanya mentransfer string. Menyediakan kelas yang berbeda untuk kesalahan, Anda memberi pengembang kesempatan untuk menangani kesalahan tertentu dengan cara yang sesuai (tidak hanya menampilkan pesan kesalahan). Orang yang menangkap pengecualian Anda bisa sespesifik yang mereka butuhkan jika Anda menggunakan hierarki.
a) Seseorang mungkin perlu mengetahui alasan spesifiknya
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
a) orang lain tidak ingin mengetahui detailnya
} catch (const std::exception & ex) {
Anda dapat menemukan beberapa inspirasi tentang topik ini di https://books.google.ru/books?id=6tjfmnKhT24C Bab 9
Selain itu, Anda juga dapat memberikan pesan khusus, tetapi hati-hati - tidak aman untuk membuat pesan dengan salah satu std::string
atau std::stringstream
atau cara lain yang dapat menyebabkan pengecualian .
Secara umum, tidak ada perbedaan apakah Anda mengalokasikan memori (bekerja dengan string dengan cara C ++) dalam konstruktor pengecualian atau tepat sebelum melempar - std::bad_alloc
pengecualian dapat dilemparkan sebelum yang Anda inginkan.
Jadi, buffer yang dialokasikan di stack (seperti dalam jawaban Maxim) adalah cara yang lebih aman.
Ini dijelaskan dengan sangat baik di http://www.boost.org/community/error_handling.html
Jadi, cara yang lebih baik adalah jenis pengecualian tertentu dan menghindari penulisan string yang diformat (setidaknya saat melempar).
std∷exception
tidak memiliki konstruktor denganchar*
arg.