Archiwum dla tagu exceptions

Wysłany dnia 24 lipca 2010 o godzinie 19:10. Skomentuj!, kategorie: Natywne, Programowanie , tagi: , , , .

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()
    ) {}
};