2010-06-04 10 views
26

Podczas projektowania bibliotek klas, Podczas tworzenia metody, kiedy zdecydujesz się rzucić wyjątek lub zwrócić wartość logiczną.Kiedy należy zwrócić wartość bool, należy podać wyjątek i wyjątek, aby rzucić

Na przykład.

public class MathHelper 
{ 
    public int Divide(int x, int y) 
    { 
     if(y == 0) 
     { 
      throw new DivideByZeroException("Cannot Divide by Zero"); 
     } 
     return x/y;  
    } 
} 

Jest to prosty przypadek, ale wtedy zaczynasz tworzyć bardziej złożone metody.

Który wolisz?

public void Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     throw new ArgumentNullException("The reader cannot be null"); 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     throw new ArgumentNullException("The delimeter cannot be null"); 
    } 
} 

public bool Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     logger.Error("Parse failed with null reader"); 
     return false; 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     logger.Error("Parse failed with null delimeter"); 
     return false; 
    } 
} 

Odpowiedz

29
  • Wyjątkiem są generalnie droga do rzeczy, których awaria nie jest oczekiwane jako opcja.

  • Boolowskie wartości zwracane są czasem na rzeczy, w których czasami porażka może być oczekiwanym rezultatem.

Tak więc, w twoich przykładach powiedziałbym, że idę z wyjątkami.

6

dokumentacja Java ma coś do powiedzenia o standardowym sposobem sprawdzenia warunków wstępnych:

https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#preconditions

Oznacza to, spowodować wyjątek, czy to publiczne, i używać stwierdzić, czy to prywatne.

+0

Bardzo podoba mi się ta odpowiedź, ponieważ jeśli używasz jej tylko do wewnętrznych bibliotek, wyrzucenie wyjątku jest kosztowne. –

+0

dany link do dokumentów jest uszkodzony. – chammu

+0

@chammu Mogę normalnie uzyskać do niego dostęp. – KnorxThieus

1

Podoba mi się sposób, w jaki C# robi to, o co pytasz w swoim przykładzie. Możesz uzyskać metodę (int.Parse), która zwraca liczbę całkowitą lub rzutuje na błąd. Istnieje również metoda (int.TryParse), która zapełnia podany argument odniesienia wartością całkowitą i zwraca boolowski kod stanu. W ten sposób, jeśli chcesz uzyskać i zrobić wyjątek, robisz to. Jeśli chcesz obsłużyć błąd inline przy użyciu warunkowego, to również opcja.

0

Podczas Akceptowane odpowiedź jest jakaś dobra ogólna rada, istnieją pewne przypadki Wolę (zaznaczone) wyjątki, nawet jeśli metoda logiczna kwalifikuje:

  • Różne rodzaje (expected) awarii, które wymagają innego traktowania. Alternatywne są kodami stanu, które wymagają odpowiednich stałych i kodów stanu, które mogą być odrobinę lepsze, ale nadal wymagają jednoznacznego sprawdzenia.

  • Propagowanie wyjątków. Czasami można wykryć awarię w warstwie modelu, ale można ją obsłużyć tylko w widoku, który jest w górę w łańcuchu. Zamiast więc zwracać wartość boolowską wszystkim funkcjom i propagować wartość zwracaną, należy użyć domyślnego zachowania wyjątków i przechwycić je w najwyższej warstwie.

Powiązane problemy