2010-06-04 14 views
26

Nel progettare le librerie di classi, Quando si crea un metodo, quando si decide di lanciare un'eccezione o di restituire un booleano.Quando restituire bool, lanciare un'eccezione e quale eccezione lanciare

Ad esempio.

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

Questo è un caso semplice, ma dopo si inizia a creare metodi più complessi.

Quale preferisci?

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; 
    } 
} 

risposta

29
  • Le eccezioni sono generalmente il modo di andare per le cose in cui il fallimento non è previsto come opzione.

  • I valori di ritorno booleani sono la strada da percorrere per le cose in cui il guasto potrebbe essere un risultato previsto a volte.

Così, nei vostri esempi, direi andare con le eccezioni.

6

documentazione Java ha qualcosa da dire sul modo standard per controllare precondizioni:

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

Cioè, sollevare un'eccezione se si tratta di comuni e l'uso affermare se è privato.

+0

Mi piace molto questa risposta, perché se lo si utilizza solo per le proprie librerie interne, il lancio di un'eccezione è costoso. –

+0

il collegamento dato a documenti è rotto. – chammu

+0

@chammu Posso normalmente accedervi. – KnorxThieus

1

Mi piace il modo in cui C# fa quello che stai chiedendo nel tuo esempio. È possibile ottenere un metodo (int.Parse) che restituisce un numero intero o genera un errore. È anche disponibile un metodo (int.TryParse) che inserisce un argomento di riferimento derivato con il valore intero e restituisce un codice di stato booleano. In questo modo, se si desidera ottenere ed eccezione, lo si fa. Se vuoi gestire un errore in linea usando un condizionale, anche questa è un'opzione.

0

Mentre risposta accettato è qualche buon consiglio generale, ci sono alcuni casi che preferisco (controllato) eccezioni, anche quando il metodo booleano qualifica:

  • Diversi tipi di guasti (attesi) che richiedono un trattamento diverso. Le alternative sono codici di stato int che richiedono costanti appropriate e enum di codice di stato che potrebbero essere un po 'meglio, ma richiedono comunque un controllo esplicito.

  • Propagazione di eccezione. A volte si rileva un errore a livello di modello, ma è possibile gestirlo solo nella vista, che è molto in alto nella catena. Quindi, invece di far tornare tutte le funzioni booleane e propagare il valore di ritorno, usa il comportamento di default delle eccezioni e catturale nel livello più in alto.

Problemi correlati