Według mnie ogólną zasadą jest używanie wyrażeń asercji do znajdowania błędów wewnętrznych i wyjątków błędów zewnętrznych. Możesz wiele skorzystać z poniższej dyskusji Grega tutaj .
Wyrażenia asertu służą do znajdowania błędów programistycznych: błędów w samej logice programu lub błędów w odpowiadającej mu implementacji. Warunek potwierdzenia sprawdza, czy program pozostaje w zdefiniowanym stanie. „Stan zdefiniowany” to zasadniczo taki, który jest zgodny z założeniami programu. Zauważ, że „stan zdefiniowany” dla programu nie musi być „stanem idealnym” ani nawet „stanem zwykłym”, ani nawet „stanem użytecznym”, ale więcej o tym ważnym punkcie później.
Aby zrozumieć, jak asercje pasują do programu, rozważ procedurę w programie C ++, która ma zamiar wyłuskać wskaźnik. Czy teraz procedura rutynowa powinna sprawdzić, czy wskaźnik ma wartość NULL przed wyłuskiwaniem, czy też powinna zapewnić, że wskaźnik nie ma wartości NULL, a następnie kontynuować i wyłuskiwać go niezależnie?
Wyobrażam sobie, że większość programistów chciałaby zrobić jedno i drugie, dodać potwierdzenie, ale także sprawdzić wskaźnik pod kątem wartości NULL, aby nie zawiesić się, gdyby potwierdzony warunek zawiódł. Pozornie wykonanie zarówno testu, jak i sprawdzenia może wydawać się najmądrzejszą decyzją
W przeciwieństwie do warunków zapewnianych przez program, obsługa błędów (wyjątków) programu nie odnosi się do błędów w programie, ale do danych wejściowych, które program uzyskuje ze swojego środowiska. Są to często „błędy” po stronie użytkownika, na przykład próba zalogowania się do konta bez wpisywania hasła. I nawet jeśli błąd może uniemożliwić pomyślne zakończenie zadania programu, nie ma awarii programu. Program nie loguje się do użytkownika bez hasła z powodu błędu zewnętrznego - błędu po stronie użytkownika. Jeśli okoliczności były inne, a użytkownik wpisał poprawne hasło, a program go nie rozpoznał; wtedy chociaż wynik byłby nadal taki sam, porażka należałaby teraz do programu.
Cel obsługi błędów (wyjątków) jest dwojaki. Pierwszym jest poinformowanie użytkownika (lub innego klienta), że wykryto błąd w danych wejściowych programu i co to oznacza. Drugim celem jest przywrócenie aplikacji po wykryciu błędu do dobrze zdefiniowanego stanu. Zauważ, że sam program nie jest w błędzie w tej sytuacji. To prawda, że program może być w stanie nieidealnym lub nawet w stanie, w którym nie można nic zrobić, ale nie ma błędu programistycznego. Wręcz przeciwnie, ponieważ stan przywracania po błędzie jest taki, jaki przewiduje projekt programu, jest to stan, z którym program sobie poradzi.