Prova / Catch o test dei parametri [duplicato]

2

Recentemente ho partecipato a un colloquio di lavoro e mi è stato dato l'incarico di scrivere un metodo semplice in C # per calcolare quando i treni si incontrano. Il codice era semplice equazione matematica. Quello che ho fatto è stato che ho controllato tutti i parametri all'inizio del metodo per assicurarmi che il codice non fallisse.

La mia domanda è: è meglio controllare i parametri, o usare try / catch?

Ecco i miei pensieri:

  • Prova / cattura è più breve
  • Try / catch funzionerà sempre anche se ti dimentichi di qualche condizione
  • Catch è lento in .NET
  • I parametri di test sono probabilmente codice più pulito (le eccezioni dovrebbero essere eccezionali)
  • I parametri di test ti offrono un maggiore controllo sui valori di ritorno

Preferirei testare i parametri in metodi più lunghi di +/- 10 righe, ma cosa ne pensi di usare try / catch in metodi semplici proprio come questo - cioè return (a*b)/(c+d);

Ci sono molte domande simili su stackexchnage, ma sono interessato a questo particolare scenario.

    
posta Ondra 30.11.2012 - 11:20
fonte

4 risposte

4

La regola generale è in effetti quella di testare le condizioni di errore prima di continuare (probabilmente lanciando un'eccezione se il test fallisce).

Praticamente per le ragioni che hai citato sopra.

In termini di implementazione, puoi anche separare nettamente la convalida dall'implementazione (ciò avviene molto spesso nel codice BCL).

    
risposta data 30.11.2012 - 11:24
fonte
0

Prova a catturare se stai facendo affidamento su qualcosa di esterno, ad esempio un altro servizio o un server DB.

Controlla solo i parametri se è qualcosa di interno come nell'esempio.

    
risposta data 30.11.2012 - 14:03
fonte
0

Dipende da quanto specifici vuoi essere riguardo alla causa del problema. Se si esegue il test in avanti, è possibile generare un'eccezione che indica con precisione quali ingressi sono in errore. Tuttavia, se si stanno eseguendo calcoli a virgola mobile, è necessario un attento esame del corpo del metodo per determinare quali input sono validi. Questo potrebbe non essere sempre fattibile. Il tuo post non esprime completamente la complessità del tuo semplice esempio:

(a * b) / (c + d)

Non è sufficiente testare semplicemente c + d != 0 . Se questi sono numeri in virgola mobile, hai anche la possibilità di overflow quando a * b è molto più grande di c + d .

Nei calcoli numerici, è spesso impossibile stabilire se gli input possono produrre un risultato senza eseguire il calcolo.

Generalmente preferisco scrivere codice lineare e consentire alle propagazioni di eccezioni, oppure catturarli e convertirli in qualcosa di significativo per il chiamante.

Di rado mi preoccupo della lentezza della funzione del linguaggio fino a quando non si verifica un problema di prestazioni noto.

    
risposta data 30.11.2012 - 19:15
fonte
0

Codice completo ha un buon capitolo (8) su questo.

La prima domanda che chiedo è da dove proviene l'input. Proviene dall'interno dell'applicazione (probabilmente considerato "sterile") o proviene da qualche altra parte (ad esempio, input dell'utente)?

Penso che sia necessario conoscere la risposta a questa domanda per determinare se gli input devono essere controllati e come gestire ciò che accade quando non sono validi.

    
risposta data 30.11.2012 - 22:44
fonte

Leggi altre domande sui tag