Obsługa błędów w C++

Ostatnio rozmyślałem nad modelem obsługi błędów w moim przyszłym frameworku. Do tej pory każda moja funkcja zwracała wartość logiczną: false w razie niepowodzenia, true w przeciwnym wypadku. Użycie wyglądało mniej więcej tak:
if( !Funkcja() ) // Jeżeli się nie powiodło
{ /* Obsługa błędu */ }

Takie rozwiązanie ma jednak dość poważną wadę: nie otrzymujemy żadnej dodatkowej informacji dotyczącej błędu. Również sam kod nie wygląda w tym przypadku najlepiej, gdyż to rozwiązanie często prowadzi do wielu zagnieżdżonych instrukcji if.

Inne rozwiązanie polega na zwracaniu przez funkcję liczby całkowitej. Wartości ujemne oznaczają wtedy błąd, zaś dodatnie lub zero - powodzenie. Dodatkowo tworzymy enumerację zawierającą przyczyny błędów:
enum ERROR_CODE{ ERR_FILE_NOT_FOUND = -1, ERR_BAD_ARGS = -2, };

Dzięki temu pisząc obsługę błędu mamy informację na temat jego przyczyny:
int e = Funkcja(arg);
if( e == ERR_FILE_NOT_FOUND )
{ /* Nie znaleziono pliku! */ }
else if( e == ERR_BAD_ARGS )
{ /* Nieodpowiednie argumenty! */ }

Jeżeli interesuje nas sam fakt wystąpienia błędu możemy powiadomić o nim użytkownika w taki sposób:
if( Funkcja() < 0 )
{ /* Wystąpił jakiś błąd… */ }

W tym rozwiązaniu nie występuje już problem z przyczyną błędu. Jednak konieczność opakowania niemal każdego wywołania funkcji w oddzielną instrukcję if nie zachęca do jego używania. Mimo to, ten sposób jest z powodzeniem stosowany w wielu bibliotekach.

Trzeci sposób jaki przychodzi mi do głowy to skorzystanie z mechanizmu wyjątków. Dzięki nim otrzymujemy pełną informację o błędzie oraz zgrabny zapis. Dodatkową zaletą jest to, że wyjątki, w przeciwieństwie do zwracanych kodów błędów, nie mogą zostać zignorowane. Przyczynia się to do zwiększenia niezawodności kodu. Wyjątki, w przeciwieństwie do kodu błędu, mogą być rzucane w konstruktorach oraz przeładowanych operatorach. Oczywiście nie ma rzeczy idealnych. Podobnie jest z wyjątkami - ich użycie wiąże się z pewnym narzutem, w wyniku czego kod wykonuje się nieco wolniej.

Ostatecznie, po długich rozważaniach, zdecyduję się na trzecie rozwiązanie, czyli wyjątki.

Nowy projekt

Ostatnio rozpocząłem prace nad nowym projektem. Będzie to framework (żeby nie użyć innej brzydkiej nazwy;). Będzie to największy projekt z jakim do tej pory miałem do czynienia. Niestety chwilowo nie wiem jeszcze jak go nazwać. Obecnie jestem na etapie projektowania i od kodu trzymam się z daleka - przekonałem się na własnej skórze o prawdziwości stwierdzenia “Trzeba dwa razy pomyśleć, zanim zacznie się pisać, żeby nie trzeba było dwa razy pisać, zanim zacznie się myśleć.

Posted in Inne. 2 Comments »

Compo

Jako że niedawno ruszyła wielkanocna edycja konkursu Compo, postanowiłem wziąć w nim udział. Tematem jest absurdalna gra. Za kod wezmę się dopiero jutro, bo dzisiaj nie mam na to ochoty. Mam tylko nadzieję, że nie zabraknie mi czasu, ponieważ mam zamiar użyć D w którym jeszcze nic nie napisałem :)

[edit]

Jak nietrudno zauważyć, moja praca nie pojawiła się w konkursie. Powodów było kilka - nie dość, że dopadła mnie choroba, to jeszcze rozpoczęła się znowu szkoła po świątecznej przerwie. Jednak patrząc na ilość i jakość niektórych prac wydaje mi się, że moje szanse na zdobycie jakiegokolwiek punktu byłyby bliskie zeru :)

D Programming Language

Ostatnio przemierzając otchłań Internetu przypadkiem trafiłem na stronę języka D. Z ciekawości przeczytałem listę jego “ficzersów”, a ponieważ ta wyglądała obiecująco, przejrzałem prawie całą specyfikację tego języka.

Wśród zalet D z pewnością należy wymienić:

  • wbudowany (ale opcjonalny!) garbrage collector
  • brak plików nagłówkowych
  • wbudowany system tworzenia dokumentacji oraz testów jednostkowych
  • możliwość niskopoziomowych operacji, w tym inline assembler
  • moduły
  • jest kompilowany do kodu maszynowego, a szybkością dorównuje nawet C++

Jego możliwości są naprawdę ogromne. Dla mnie byłby on językiem idealnym, gdyby nie dwie rzeczy. Po pierwsze - na chwilę obecną brak jest dobrego IDE z kolorowaniem kodu, uzupełnianiem składni i debuggerem. Druga, dość poważna wada to mała ilość przeportowanych bibliotek. Jednak ta sytuacja powoli zmienia się na lepsze.

D, ze względu na jego cechy, być może w niedalekiej przyszłości użyję do jakiegoś niewielkiego projektu. Póki co zostaję przy starym, poczciwym C++ :)

    Hello world!

    No i stało się. W końcu i mnie dopadła chęć posiadania własnego bloga. Od czasu do czasu będę się z Wami dzielił moimi przemyśleniami na temat programowania i nie tylko. Miejmy tylko nadzieję, że szybko mi się to nie znudzi :)