Mam okazję pisać „większą” wtyczkę do Foobara2000(więcej o niej już wkrótce). Foobar2000 w dużej mierze opiera się na wyjątkach bazujących na std::exception. Ja, chcąc zaraportować błąd, postanowiłem stworzyć sobie własny wyjątek. Beztrosko piszę sobie klasę dziedziczącą z std::exception, dobieram parametry do konstruktora i próbuję zainizjalizować klasę bazową. Wszystko byłoby okej, gdyby nie to, że ja używam std::wstring a wyjątki bazują na std::string. Całe szczęście nie okazało się to dużym problemem, wystarczy skopiować wstring do stringa i „wszystko gra”(pod warunkiem, że nie używamy znaków spoza ASCII).
std::string base = L"abcd"; std::string out(base.begin(), base.end());
.
Chciałem też sformatować sobie wiadomość, coby ładnie wyglądała a ja nie musiał za każdym razem przekazywać całej wiadomości(bo i tak tylko dwa parametry się zmieniały). Normalnie zrobiłbym to w ciele konstruktora za pomocą s(w)printf lub tym podobnych(stringstream?). Niestety, std::exception nie umożliwia zmieniania wiadomości poza konstruktorem. Całe szczęście std::stringi można w prosty sposób łączyć(przeładowany operator +). Tym oto sposobem napisałem takiego potworka:
class CommandParamsException:
public std::exception
{
public:
CommandParamsException(const std::wstring& paramName, const std::wstring& reason)
: exception(
(
std::string("Parameter '") +
std::string(paramName.begin(), paramName.end()) +
"' is " +
std::string(reason.begin(), reason.end()) +
". "
).c_str()
) {}
};