Wyjątki nie zawierają użytecznych szczegółów, ponieważ koncepcja wyjątków nie jest jeszcze wystarczająco dojrzała w dyscyplinie inżynierii oprogramowania, więc wielu programistów nie rozumie ich w pełni, a zatem nie traktuje ich odpowiednio.
Tak, IndexOutOfRangeException
powinien zawierać dokładny indeks, który był poza zakresem, a także zakres, który był ważny w momencie jego wyrzucenia, i jest to godne pogardy dla twórców środowiska uruchomieniowego .NET, że tak nie jest. Tak, table or view not found
wyjątek Oracle powinien zawierać nazwę tabeli lub widoku, która nie została znaleziona, i ponownie fakt, że nie jest to godne pogardy dla każdego, kto jest za to odpowiedzialny.
W dużej mierze zamieszanie wynika z błędnego pierwotnego pomysłu, że wyjątki powinny zawierać wiadomości czytelne dla człowieka, co z kolei wynika z niezrozumienia, o co chodzi w wyjątkach, więc jest to błędne koło.
Ponieważ ludzie uważają, że wyjątek powinien zawierać komunikat czytelny dla człowieka, uważają, że wszelkie informacje przenoszone przez wyjątek powinny być również sformatowane w komunikacie czytelnym dla człowieka, a następnie albo znudzeni są pisaniem całej wiadomości czytelnej dla człowieka budowanie kodu lub obawiają się, że może to ujawnić niewskazaną ilość informacji wszystkim wścibskim oczom, którzy mogą zobaczyć wiadomość. (Problemy bezpieczeństwa wymienione w innych odpowiedziach).
Ale prawda jest taka, że nie powinni się tym martwić, ponieważ wyjątek nie powinien zawierać przesłania czytelnego dla człowieka. Wyjątki to rzeczy, które tylko programiści powinni widzieć i / lub sobie z nimi radzić. Jeśli kiedykolwiek istnieje potrzeba przedstawienia użytkownikowi informacji o awarii, należy to zrobić na bardzo wysokim poziomie, w wyrafinowany sposób oraz w języku użytkownika, który, statystycznie rzecz biorąc, prawdopodobnie nie jest angielskim.
Zatem dla nas, programistów, „komunikat” wyjątku jest nazwą klasy wyjątku i wszelkie inne informacje dotyczące wyjątku powinny zostać skopiowane do (końcowych / tylko do odczytu) zmiennych składowych obiektu wyjątku. Najlepiej, jeśli jest to możliwe. W ten sposób żadna wiadomość nie musi (lub powinna) zostać wygenerowana i dlatego żadne wścibskie oczy nie mogą jej zobaczyć.
Aby rozwiązać problem wyrażony przez Thomasa Owensa w komentarzu poniżej:
Tak, oczywiście, na pewnym poziomie, to będzie tworzyć wiadomości dziennika dotyczące wyjątku. Ale już widzisz problem z tym, co mówisz: z jednej strony komunikat dziennika wyjątków bez śladu stosu jest bezużyteczny, ale z drugiej strony nie chcesz, aby użytkownik widział cały ślad stosu wyjątków. Ponownie naszym problemem jest to, że nasza perspektywa jest wypaczona przez tradycyjne praktyki. Pliki dziennika były tradycyjnie zwykłym tekstem, co mogło być w porządku, gdy nasza dyscyplina była w powijakach, ale być może już nie: jeśli istnieje obawa o bezpieczeństwo, plik dziennika musi być binarny i / lub szyfrowany.
Niezależnie od tego, czy jest to tekst binarny, czy zwykły, plik dziennika należy traktować jako strumień, w którym aplikacja serializuje informacje debugowania. Taki strumień byłby tylko dla programistów, a zadanie generowania informacji debugowania dla wyjątku powinno być tak proste, jak serializacja wyjątku do strumienia dziennika debugowania. W ten sposób, patrząc na dziennik, zobaczysz nazwę klasy wyjątku (która, jak już wspomniałem, jest dla wszystkich praktycznych celów „komunikatem”), każdą zmienną składową wyjątku, która opisuje wszystko, co jest istotne - oraz -praktyczne do włączenia do dziennika i śledzenia całego stosu. Zwróć uwagę, że w tym procesie wyraźnie brakuje formatowania czytelnego dla człowieka komunikatu o wyjątku .
PS
Jeszcze kilka moich przemyśleń na ten temat można znaleźć w odpowiedzi: Jak napisać dobry komunikat o wyjątku
PPS
Wygląda na to, że wiele osób zostało odreagowanych przez moją sugestię dotyczącą binarnych plików dziennika, więc ponownie poprawiłem odpowiedź, aby jeszcze bardziej wyjaśnić, że to, co sugeruję tutaj, nie polega na tym, że plik dziennika powinien być binarny, ale że plik dziennika może być binarny, jeśli to konieczne.