Zastanawiam się jaki jest najlepszy sposób obsługi błędów w aplikacji desktopowej. Do tej pory stosowałem zwykłe kody błędów zwracane przez funkcje/metody podobne do tych z WinAPI. Prowadziło to do różnych niedogodności jak np. duża ilość instrukcji if (lub case/switch), czy zwracanie wartości przez parametry wyjściowe. W nowym programie chciałem zastosować wyjątki, ale myślę jak zrobić to w poprawny/najlepszy sposób.
Do tej pory wpadłem na dwie koncepcje:
type TMyException = class
public
class procedure RaiseError1(Msg:string);
class procedure RaiseError2(const Msg: string; const Args: array of const);
...
end;
class procedure TMyException.RaiseError1(Msg: string);
begin
Logger(Msg);
raise Exception.Create(Msg);
end;
class procedure TMyException.RaiseError2(const Msg: string;
const Args: array of const);
begin
Logger(Msg, Args);
raise Exception.CreateFmt(Msg, Args);
end;
Kod testowy:
```delphi
try
TMyException.RaiseError1('example 1');
except
// on E: Exception do ShowMessage(E.message); // dodatkowe dzialanie, gdy wystąpi wyjątek
end;
Zalety:
- obsługa wszystkich błędów w jednym miejscu - klasa TMyException
- proste logowanie występujących błędów - obiekt Logger występuje tylko w klasie TMyException
Wady: - brak możliwości reagowania na określony typ wyjątku
type
// każda klasa posiada swoje typy wyjątków
ETEST1 = class(Exception);
ETEST2 = class(Exception);
...
// kod testowy
try
raise ETEST1.Create('example 1');
except
on E: ETEST1 do Logger(E.message);
end;
Zalety:
- selektywna obsługa błędów, każdy rodzaj wyjątku może wykonywać inne akcje
- typy wyjątków ograniczone są tylko do klasy, w której występują
Wady: - problem z logowaniem błędów - każdy wyjątek musi być oddzielnie obsłużony
- obiekt Logger musi być dostępny w każdej klasie
Macie pomysły na inne zalety/wady/problemy związane z przedstawionymi koncepcjami? Może są jakiś inne sprawdzone rozwiązania obsługi i logowania błędów?