Obsługa wyjątków

głosy
2

Structured Exception Handling jest zły? Co jest właściwym sposobem obsługi wyjątków?

EDIT: Exception Handling w .NET przy użyciu C #.

I mają zwykle zestaw konkretnych klas wyjątków (DivideByZeroException, ArrayTypeMismatchException) i nie mają ogólny „catch (Exception ex)”.

Myślenie za to, że mogę spodziewać się pewnych typów wyjątków występują i mają konkretne działania określone w momencie ich wystąpienia, a nieoczekiwane wyjątki miałyby wzrosnąć o interfejs (Windows lub internetowej). Jest to dobra praktyka?

Utwórz 09/12/2008 o 15:31
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
6

Nie jestem pewien co masz na myśli przez „obsługę wyjątków zorganizowanego”.

Najgorsze, co można zrobić w obsługę wyjątków jest „jaskółka” wyjątek lub obsługiwać go w milczeniu.

Nie rób tego:

try {
   ...
}
catch (Exception e) {
   //TODO: handle this later
}

Jest to bardzo często odbywa się z lenistwa, aby uzyskać kod do kompilacji. Jeśli nie wiesz jak obsługiwać wyjątek na określonym poziomie, mają sposób rzucić wyjątek i mieć przynajmniej złapać wszystkie obsługi na górze. Przekaż opinię jakoś (przez GUI, strony / e-mail do osoby wsparcia, plik dziennika), tak, że problem może w końcu dostać stałe. Cicho połowu wyjątek prawie zawsze prowadzi do większego problemu dzieje się później i to jest trudne do śledzenia.

Odpowiedział 09/12/2008 o 15:39
źródło użytkownik

głosy
3

instrukcje catch + ślady stosu. Nigdy nie złapać wyjątek bez drukowania ślad stosu, to czy ktoś inny miał do kasy ten kod ponownie i ślady stosu miejsce w bloku catch, gdy wystąpi błąd i pliki dziennika są albo puste lub niejasne.

Odpowiedział 09/12/2008 o 15:33
źródło użytkownik

głosy
1

Jest to złożony temat ... są książki na ten temat ... ale ... Istnieją dwa główne typy obsługi wyjątków ... inline, gdzie kod do czynienia z potencjalnych błędów jest inline z kodem, że metoda lub rutyna będzie „normalnie” Execute i uporządkowany obsługa wyjątków, których kod jest gdzie indziej, a teh infrastruktura jest przeznaczony do automatycznego switych do tego kodu obsługi wyjątków, gdy wystąpi niespodziewane wydarzenie (błąd) ... Obie mają advantedges i disadvanteges. Podejście „inline” ma tendencję do wytwarzania kodu, który jest znacznie bardziej zaśmiecone (z kodem błędu) i trudniejsze do odczytania i utrzymaniu. Ale łatwiej jest produkować frontu, gdyż nie wymaga żadnej upfront analizy przypadku korzystania inline obsługę błędów, często można zobaczyć metody numeryczne powrocie logicznych lub „error” kodów, indiocating do rozmówcy czy metjhod lub rutyna był udany. Eliminuje to „funkcjonalnej” składnię konieczności rutynowego „return” znaczącą wartość biznesową lub obiektu, (ponieważ każdy funkcji mocy konwencji musi zwracać kod błędu) W przypadku korzystania strukturalną obsługę wyjątków, kwestia ta jest dyskusyjna.

Zorganizowany obsługa wyjątków, OTOH na ogół trudniej jest dobrze, ponieważ wymaga się analizy przednią, co błędy rutynowe lub metoda mogłaby produkować, a co do tego, co metoda może lub powinien zrobić o każdym błędzie, jeśli nie występują.

Jedno jest pewne, nie należy mieszać tych dwóch podejść w jednym składniku ...

Odpowiedział 09/12/2008 o 15:59
źródło użytkownik

głosy
1

Moja rekomendacja:

Nie połowu wyjątek chyba że:

  • Niezastosowanie się do tego może spowodować awarię aplikacji (np obsługi zdarzeń)
    • I w tej sytuacji, należy zalogować się na wyjątek, aby wiedzieć, co się stało i kiedy
  • Można coś zrobić, aby spróbować zaradzić tej sytuacji (np wdrożenie mechanizmu ponawiania podczas wywoływania zewnętrznego interfejsu API, które sporadycznie zgłasza wyjątek (zauważ, że obsługę wyjątków nie powinny być wykorzystywane do kontrolowania przepływu programów))
    • I w tej sytuacji, tylko złapać konkretny typ wyjątku, że można oczekiwać, aby wrzucony

Catching wyjątek na najwyższym możliwym poziomie oznacza, że ​​masz maksymalną stos wywołań, co jest bardzo przydatne, gdy idziesz przez dzienniki i starając się zobaczyć, co początkowe działanie spowodowało sekwencję zdarzeń, które doprowadziły do ​​wyjątku w pierwszej kolejności ,

Odpowiedział 09/12/2008 o 15:45
źródło użytkownik

głosy
0

Nie jestem programistą systemu Windows, ale wydaje mi się, że za pomocą strukturalną obsługę wyjątków traktować wyjątki sprzętowe jak wyjątkami oprogramowania oznacza, że:

  • Twój kod robi coś, co w C ++ standardowy produkuje niezdefiniowany lub wykonania zdefiniowane zachowanie (takie jak dzielenie przez zero).
  • Okna określa, że ​​z włączonym SEH zgłasza wyjątek w tej sprawie.
  • Używasz tego faktu do połowu wyjątek i / lub wykonanie obsługi terminacji.

Tak więc pytania zadać, IMO, są następujące:

  • Twoim zadaniem jest programowanie naprawdę charakter, że standard C ++ nie może obsłużyć? (Lub może obsłużyć tylko w sposób, który jest wymiernie gorsze od tego, co można uzyskać poprzez umożliwienie wyjątek sprzętowy).
  • Czy naprawdę trzeba podjąć działania, kiedy Twój kod idzie niestandardowe?
  • Można napisać kod tak, aby nie prowokować wyjątków sprzętowych w pierwszej kolejności?

W przypadku udzielenia odpowiedzi „tak”, „tak”, „nie”, potrzebne jest następnie strukturze obsługi wyjątków. W przeciwnym razie może być w stanie go uniknąć, w tym przypadku prawdopodobnie chcesz. Pisanie kodu wyjątku bezpieczny jest trudne, więc tym silniejsze wyjątek gwarantuje można zaoferować lepsze. Kod, który może dzieli przez zero z SEH nie oferuje gwarancji nothrow, kiedy być może z odrobiną przeprojektowanie tak, że dzwoniący nie dają mu dane Duff, może to zrobić. Ale jeśli funkcja ma już rzucać wyjątki dla innych powodów, wtedy też prawdopodobnie wyrzucanie ich do pułapek sprzętowych może dokonać rzeczy nie gorzej.

Jedną z istotnych Szczególnym przypadkiem jest alokacja pamięci. Nie wiem, czy .NET to robi, ale na przydział linux nie tylko jeśli jest niewystarczająca wirtualnej przestrzeni adresowej dla alokacji. Pamięć fizyczna jest zobowiązana przy pierwszym użyciu i powoduje wyjątek sprzętową jeśli nie ma wystarczająco dużo. Ponieważ przydział pamięci powinien rzucać std :: bad_alloc na niepowodzenie, a realizacja nie trafia do realizacji tego wymogu standardu, to możemożliwe, że w niektórych przypadkach konwersji wyjątek sprzętu do oprogramowania jest dobrą rzeczą do zrobienia. Jednak wyjątek ten sprzęt może pojawić się w nieoczekiwanych miejscach, (w tym procedur Ci się, że były nothrow), więc może być nadal niemożliwe obsłużyć wdziękiem, dlatego rdzeń linux wysypisk zamiast rzucania. W praktyce wszystko, co dostaje zainicjowanego całkowicie padnie jej konstruktora, który jest często na tyle blisko, że wyjątek alokacji oprogramowanie zamiast byłaby przydatna.

Odpowiedział 09/12/2008 o 16:06
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more