Dlaczego nie użyć słowa błąd zamiast wyjątku? [Zamknięte]


18

Jeśli mówimy o wyjątkach jako błędach, dlaczego po prostu nie nazwać go błędem, a nie wyjątkiem?

Jeśli w kodzie nazywa się to wyjątkiem, a gdy tylko się pojawi, nazywa się to błędem. Dlaczego więc nie nazwać tego błędem?

Dziękujemy za odpowiedź lub komentarz.


Mam nadzieję, że wspomniane szczegóły techniczne pomogą wyjaśnić różnicę między wyjątkiem a błędem. Świetne pytanie BTW, +1
Jeremy Thompson


1
Właściwie nie wiem, jak można je pomylić, ponieważ są to bardzo różne rzeczy. Wyjątkami są przypadki obsługiwane przez kod, które wskazują na pewien rodzaj błędu. Zwykle błędy niejasne, nie do końca wytłumaczalne i takie. - Podczas gdy błędy ... błąd z definicji nie jest obsługiwany przez sam kod. Nie są to nawet błędy, wskazują na brak logiki tam, gdzie nie powinien.
tvCa,

1
@NiklasRtz: Dlaczego ogromna nagroda? Mnóstwo ludzi odpowiedziałoby niezależnie.
ThePopMachine,

@ThePopMachine Ponieważ lubię duże nagrody za pytania, które inni mogą uznać za interesujące. Odpowiadam na moje „popularne” pytania i udzielam odpowiedzi na tyle, na ile mogę. Bardzo mi pomogły dobre i zabawne pytania i odpowiedzi. Przygotowuję również nowe pytanie dotyczące obsługi błędów i kodów błędów dla tych programistów. Nie jest to szczegółowe, jak pisać kod, ale jak obsługiwać błędy w ograniczony i, miejmy nadzieję, znormalizowany sposób dla przykładowych aplikacji internetowych, które mogą zwrócić ograniczoną liczbę kody błędów, jak dobre są niesłyszące i nazewnictwo części kodu.
Niklas

Odpowiedzi:


93

Cóż, to całkiem proste: nie wszystkie wyjątki są błędami (i podobnie, nie wszystkie błędy objawiają się jako wyjątki).

Jako przykład wyjątku, który nie jest błędem, jeśli czytasz plik z dysku USB i ktoś wyciąga dysk z gniazda. To spowoduje powstanie wyjątku (to znaczy w większości języków, które obsługują wyjątki). Ale to nie jest błąd w kodzie.

I odwrotnie, błąd może objawiać się jako błąd obliczeniowy lub coś w tym rodzaju. Nadal dostajesz odpowiedź, to po prostu nie jest właściwa.

To powiedziawszy, wyjątek, który dociera aż do szczytu stosu, prawdopodobnie jest błędem. W powyższym przykładzie USB powinieneś być w stanie wychwycić ten wyjątek i przedstawić użytkownikowi miły błąd z informacją: „Nie można odczytać z pliku, ponieważ nie jest on już podłączony”. lub coś. Jeśli po prostu podasz im IOExceptionjakiś funky kod błędu, to jest to błąd. Ale sam wyjątek nie jest.


1
Masz rację, nawet gdy patrzę na to, jak to robię: jeśli metoda nie uzyska nazwy najbliższego miasta (Los Angeles), wyłapuje wyjątek i zwraca nazwę większego obszaru administracyjnego (np. Kalifornii), ale ponieważ ma zastosowanie do dowolnej współrzędnej, miejsce bez bliskiego miasta nie jest błędem, jest wyjątkiem. Czy sie zgadzasz?
Niklas

1
@Nicke: Tak, zgodziłbym się z tym.
Dean Harding

1
Przedstawienie wyjątku IOException i kodu błędu nie zawsze jest błędem. To jest diagnostyka. Często robię to w przypadku skryptów osobistych, w których błąd oznacza, że ​​po prostu wprowadzam nieprawidłowe argumenty.
Thomas Eding,

23

Prosty i prosty, wyjątek nie jest (zawsze) błędem!

Zgłaszany jest wyjątek (lub powinien być), gdy dzieje się coś wyjątkowego. Jeśli występuje problem z moim dyskiem twardym i nie można zapisać pliku, nie jest to błąd. To jest awaria sprzętu.

Błąd jest zazwyczaj wynikiem złego programowania. Jeśli aplikacja robi coś, czego nie oczekuje się w wyniku błędu programowania, jest to błąd.


1
Heh, odpowiedzieliśmy prawie w tym samym czasie, a także w zasadzie na ten sam przykład :-)
Dean Harding,

5
@DeanHarding Wielkie umysły myślą podobnie, tak? : D

1
Chociaż zgadzam się z twoim pierwszym zdaniem, nie mogę się zgodzić z twoim ostatnim zdaniem. Pierwszy bug komputerowy (choć apokryficzny) był w rzeczywistości, ćma uwięziony między punktami przekaźnika. Czym różni się uszkodzony dysk twardy?
Scott Whitlock,

1
@ScottWhitlock Myślę, że „błąd” ma więcej niż jedną definicję. Zawsze uważałem, że oznacza to błędy spowodowane przez ludzi: en.wikipedia.org/wiki/Software_bug

1
@ScottWhitlock: i podobno programiści powiedzieliby: „nie moja wina, musi to być błąd”, co odniosło skutek, gdy „błąd” oznaczał błąd oprogramowania. Dzisiaj awaria sprzętu nie byłaby nazywana błędem, chociaż błąd może spowodować awarię sprzętu.
jmoreno

20

To nie to samo.

Bug jest niezamierzone zachowanie kawałek oprogramowania: oprogramowanie nie robi to, co ma robić. Błędy mogą występować na wszystkich poziomach rozwoju oprogramowania, od zwykłych starych literówek, przez błędy logiczne, aż po nieodpowiednie specyfikacje funkcjonalne.

Wyjątkiem , przeciwnie, może odnosić się albo niezwykłego stanu programu, odbiegające od normalnego stanu, lub, bardziej szczegółowo, do konstrukcji języka, w którym sygnał i obsługiwać takie warunki.

Wystąpienie wyjątku może być oznaką błędu, ale często tak nie jest. Na przykład aplikacja, która ma pobrać dokument z adresu URL i przetworzyć go lokalnie, może zgłosić wyjątek, gdy zdalny serwer jest wyłączony: aplikacja odbiega od normalnego działania (nie może pobrać i przetworzyć dokumentu), ale jeśli odpowiednio obsługuje wyjątek i odzyskuje, wtedy nie ma błędu.

I odwrotnie, obecność błędu niekoniecznie objawia się jako wyjątek. Aplikacja może po cichu odrzucić wprowadzone dane, zamiast przechowywać je w swojej bazie danych; nie zostanie zgłoszony żaden wyjątek, ale nadal jest to błąd.


+1 za zdefiniowanie warunków. Ogólnie ludzie powinni to robić częściej!
yfeldblum

To zdecydowanie najjaśniejsza odpowiedź. bardzo jasne i zwięzłe. Dobra robota!
Locke,

5

Wyjątki i błędy nie są w ogóle powiązane. Jasne, czasami rzucasz wyjątek i to oznacza błąd. Ale czasami oznacza to po prostu wyjątkową, niezwykłą okoliczność, która niekoniecznie jest błędem w programie. Zwłaszcza w języku zadowolonym z wyjątków, takim jak Java, gdzie każda standardowa operacja i jej pies rzuca około pięciu różnych wyjątków - na przykład niepowodzenie otwierania pliku, niepowodzenie odczytu pliku itp.


3

Wyjątki nie zawsze są związane z błędami. Pomyśl o tym jako o czymś, co może pójść nie tak z tym, co robisz.

Przykładem, który przychodzi mi na myśl, jest InetAddress.getByName (), która służy do rozpoznawania nazwy domeny. Jeśli coś się stanie i zostanie zgłoszony wyjątek UnknownHostException, to tak naprawdę nie jest to problem z kodem.


2

Błąd oprogramowania jest powszechnym terminem używanym do opisania błędu, wady, pomyłki, awarii lub błędu w programie komputerowym lub systemie, który daje niepoprawny lub nieoczekiwany wynik lub powoduje, że zachowuje się w niezamierzony sposób. Może nawet jest to błąd pisowni na etykiecie.

Wyjątki różnią się od błędów. Każdy rodzaj wyjątku (naruszenie dostępu, przepełnienie stosu itp.) Może zostać zgłoszony do debuggera jako wyjątek „pierwszej szansy” lub „drugiej szansy”. Wyjątki od pierwszej szansy z definicji nie mają charakteru krytycznego, chyba że nie są odpowiednio obsługiwane za pomocą procedury obsługi błędów, w którym to momencie są one zgłaszane ponownie jako wyjątek od drugiej szansy (który może obsłużyć tylko debugger).

Jeśli żaden debugger nie obsługuje wyjątku drugiej szansy, aplikacja zostaje zamknięta.


2

Możesz sam uzasadnić wyjątek, miejmy nadzieję, że celowo nigdy nie wprowadzisz błędu.


brzmi to bardziej jak komentarz, patrz Jak odpowiedzieć
gnat

1
Zwięzłość nie oznacza, że ​​nie jest to odpowiedź, która podkreśla różnicę między tymi dwiema rzeczami.
Alan B,

1

Wszystkie wyjątki nie są błędami. Tematem debaty może być to, że wszystkie błędy są wyjątkami, czy nie.

Możemy powiedzieć, że wyjątkami są zdarzenia, które nie są częścią normalnego lub oczekiwanego przepływu aplikacji. Zdarzenia te mogą być niezależne od sposobu pisania kodu, gdzie błąd jest zasadniczo wynikiem złego kodu (np. Złego obliczenia).

Oto przykład, jak brak obsługi wyjątku może być błędem.

Załóżmy, że istnieje program, który zapisuje niektóre dane na zewnętrznym urządzeniu magazynującym. Podczas pisania zewnętrzne urządzenie pamięci masowej było odłączone od zasilania, uległo awarii lub może zostać zniszczone (z jakiegokolwiek powodu). Jest to wyjątkowy przypadek, niezależnie od tego, czy język programowania obsługuje wyjątkową obsługę, czy nie, jeśli program ulegnie awarii lub zachowa się z powodu tego zdarzenia, jest to błąd (użytkownik końcowy może nie wiedzieć, co się stało. Jest to również bardzo nieprzyjemne) . Ale jeśli program przerywa proces z wdziękiem, powiadom użytkownika (innymi słowy obsługuj wyjątek), to oczywiście nie jest błąd.

Języki programowania try catch machanism są zasadniczo narzędziem ułatwiającym nam wyjście z nieoczekiwanych zdarzeń.


1

Streszczenie : Wyjątki są dowodem złych wyników, błędy są (niektóre z) przyczyn złych wyników. Problem (do rozwiązania) nie jest wyjątkiem, problemem jest to, co spowodowało wyjątek.

Resoning: bug jest defekt w projektowaniu lub realizacji wyrobu (nie ograniczając się do oprogramowania). Na przykład, niestosowanie odpowiednio oszacowanego przekaźnika (czas / czułość / niezawodność / pojemność) z powodu nieprawidłowej specyfikacji lub prostego błędu kompilacji. Wyjątkiem jest prawdziwy świat / run odchylenie od czasu przewidzieć (ośmielę się powiedzieć, „oczekiwać”?) Zachowań, na przykład utraty kontroli nad pojazdem podczas jazdy.

Oczywiście błąd może powodować wyjątek, ponieważ przykład w 1) może prowadzić do przykładu w 2). Ale nie wszystkie wyjątki byłyby spowodowane błędami, np. Utratą kontroli nad pojazdem, ponieważ operator miał udar.


0

Ponieważ pytanie to zostało ponownie otwarte na nagrodę, pozwól mi wspomnieć o moim artykule CUJ z 2003 roku zatytułowanym „Wyjątek czy błąd?”, Który wydaje się odpowiadać dokładnie na pytanie OP.

Zasadniczo w artykule zdefiniowano pojęcia „błąd” i „wyjątek” (podając przykłady) oraz zaproponowano strategie radzenia sobie z każdym z nich.

W artykule zaproponowano, aby nie „obsługiwać” błędów, ale zamiast tego oflagować je za pomocą asercji. Natomiast prawdziwe wyjątki wymagają obsługi kodu (możliwe zgłaszanie wyjątków / wyłapywanie).

Najważniejsze jest to, że błędy wymagają dokładnie przeciwnej strategii niż wyjątki.

Wyżej wymieniony artykuł jest już dostępny w Dr.Dobb's pod adresem : http://www.drdobbs.com/an-exception-or-a-bug/184401686

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.