Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-02-12 11:44:16

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

C+/C#/Java - wyjątki - w którym miejscu przechwytywać i rzucać?

Witam.

Tak sobie koduję i coraz bardziej dochodzę do wniosku że nie znam odpowiedzi na pytanie w temacie - dokładniej mówiąc, nie wiem w którym miejscu przełapywać rzucony wyjątek. Przykładowo mam taką sytuację:

Mam sobie biblioteki A, B i C oraz aplikacje która z nich korzysta. Biblioteki piszę samemu no i nie wiem czy dobrą praktyką jest pisanie bloku w stylu:

Kod:

try
{

}
catch(Exception e)
{
 Log("Wystąpił wyjątek: ble ble ble";
}

Czy też rethrow:

Kod:

try
{

}
catch(Exception e)
{
 Throw new Exception("Wystąpił wyjątek: tutaj dokładniejszy jego opis");
}

?

Jeżeli to drugie to co w przypadku takiej zależności:

Program korzysta z biblioteki A, ta korzysta z biblioteki B która korzysta z C - w C leci wyjątek, gdzie to powinno być ostatecznie przechwycone - w B , A czy dopiero wewnątrz kodu aplikacji ?

Z góry dzięki za rozwianie moich wątpliwości.

Pozdro.

Offline

 

#2  2013-02-12 21:02:19

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: C+/C#/Java - wyjątki - w którym miejscu przechwytywać i rzucać?

Zależy od sytuacji. Wyjątki nie zawsze są wykorzystywane do zgłaszania błędów, czasem oferują mozliwość reakcji na sytuację wyjątkową i przechwycenie wyjątku by coś zrobić z zaistniałą sytuacją. Kwestia kto powinien coś z tym zrobić. Biblioteki w zasadzie powinny raczej wyrzucać wyjatki do przechwycenia przez aplikacje z nich korzystajace, które mogą realnie z tego skorzystać, np. zalogować lub wypluć komunikat dla uzytkownika. Jeśli jedna biblioteka korzysta z innej, może przechwycić wyjątek i opakować w swój. Nie jest dobrym pomysłem łapanie czy wyrzucanie Exception, to zbyt ogólny wyjątek. Lepiej tworzyć własne wyspecjalizowane lub korzystać z bardziej pasujących do sytuacji.

Offline

 

#3  2013-02-13 08:38:52

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C+/C#/Java - wyjątki - w którym miejscu przechwytywać i rzucać?

@kamikaze:

Dzięki za info - tak zacząłem sobie szukać po google na ten temat i trafiłem na coś ciekawego:

http://google-styleguide.googlecode.com/svn/trunk/c … ml#Exceptions

Wygląda na to że w swoim kodzie Google nie stosuje wyjątków! W powyższy linku jest podana całkiem poważna argumentacja dlaczego, podobną stosują ludzie z QT które to też wyjątków nie ma... do tego widzę że niektórzy narzekają na wydajność tego rozwiązania i chociaż podkreśla się że raczej są to przykłady dość skrajne, to zdarza się że programista zrobi coś w stylu:

Kod:

try
{
    foreach(var item in tablicaWartości)
    {
        var X = Decimal.Parse(wartość)
    }
}
catch(Exception e)
{

}

Tylko po to żeby sparsować np plik zawierający jakieś kwoty + puste wartości, a takie coś potrafi znacząco spowolnić aplikacje... generalnie widzę że ludzie zgadzają się co do tego że wyjątki powinny być stosowane w sytuacjach wyjątkowych, a nie do regularnego sprawdzania, o tym nie wiedziałem (chociaż akurat ja preferuję zwykle "if'a" nad throwem ;] ).

Co do pakowania wyjątków - myślisz że ma to sens w przypadku gdy wyrzucony/zapisany ma być zawsze tylko komunikat + stacktrace, czy raczej chodzi o jakieś specyficzne sytuacje?


EDIT:

Hmmm im więcej czytam czuję się coraz bardziej zagubiony w temacie...

Jedni piszą żeby przełapywać wszystkie wyjątki, inni tylko te które można ralnie obsłużyć.
Jedni piszą żeby o ile i tak nie można nic poza logowaniem zrobić, dać sobie spokój i nic nie przechwytywać, ewentualnie używać bloku try{}finally{} zamiast try{}catch(Exception e}, w klamrze finally zrobić co trzeba do czyszczenia (o ile coś trzeba) nic nie logować i dać wyjątkowi polecieć dalej żeby tam został przechwycony - @kamikaze możesz z doświadczenia powiedzieć co jest lepsza praktyką?

Ostatnio edytowany przez Huk (2013-02-13 11:54:35)

Offline

 

#4  2013-02-22 19:00:02

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: C+/C#/Java - wyjątki - w którym miejscu przechwytywać i rzucać?

Jeszcze jedna sprawa to koszt. Programiści tak bogatej firmy jak Google czy hobbyści, studenci mający dużo czasu mogą sobie pozwolić na obsługiwanie wszystkiego nie stosując wyjątków. Praktyka często pokazuje, że przechwytywanie wyjątków często jest "złem", na które można sobie pozwolić. Ale warto ich unikać głownie ze względu na wydajność, bo (przynajmniej w .NET) kod zawarty w klauzuli try{}catch{} nie jest optymalizowany przez kompilator, z drugiej strony nie ma to aż takiego wpływu na wydajność. Unikanie przechwytywania i podnoszenia wyjątków to ekstremizm i jest uzasadniony gdzie wydajność jest kluczowa, i najważniejsza.


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)