Domanda

Dammi alcuni dei tuoi pensieri su quale sia una migliore pratica di codifica / rende il codice più efficiente / sembra più bello / qualunque cosa: aumentare e migliorare la tua capacità di usare se le dichiarazioni per anticipare e cogliere potenziali problemi? O semplicemente fare un buon uso di try / catch in generale?

Diciamo che questo è per Java (se è importante).

Modifica: Attualmente mi sto spostando da alcune pratiche di codifica attualmente dichiaratamente obsolete e limitate, ma sono un po 'lacerato dalla necessità di farlo su alcuni punti (come come questo). Sto semplicemente chiedendo alcune prospettive su questo. Non un dibattito.

Altri suggerimenti

I blocchi

?? se sono leggermente più veloci; se non ne avrai bisogno di una dozzina, sono un'idea migliore di try / catches . Le eccezioni dovrebbero essere eccezionali, non ogni volta che il codice viene eseguito. Uso le eccezioni per eventi rari come le disconnessioni del server (anche se si verificano alcune volte al giorno) e i blocchi if per una qualsiasi delle mie variabili controllabili.

Indipendentemente dal codice che stai scrivendo, finirai per usarli entrambi. Non posso parlare per il runtime Java, ma sul runtime .NET c'è un hit delle prestazioni associato all'uso dei blocchi try-catch. Di conseguenza, provo a usarli solo nelle aree in cui ho un modo chiaro di gestire l'eccezione una volta rilevata (anche se sta solo registrando l'esistenza di un problema).

Se ti ritrovi a usare molti blocchi try-catch o if-else nel tuo codice o i tuoi metodi tendono ad essere piuttosto lunghi, considera di rifattorizzare il codice in un numero maggiore di metodi più piccoli. L'intento della tua logica sarà più facile da seguire, oltre che più facile da testare l'unità.

Penso che se le dichiarazioni sono migliori. Non puoi circondare ogni riga di codice con un try..catch (bene, ma non dovresti farlo). Puoi racchiudere un blocco di codice con try catch ma non tutte le righe.

E le eccezioni rallentano le cose.

Il mio 2p: usare try / catch è il migliore:

  • rende assolutamente chiaro agli altri programmatori che stai gestendo le eccezioni
  • il compilatore comprende cosa stai facendo e può eseguire controlli di compilazione più appropriati per te

Nella mia esperienza, l'uso della logica if-condizionale rende più difficile distinguere la gestione degli errori dalla logica aziendale.

Da quanto mi è stato detto da sviluppatori e analisti più esperti, try / catch è più orientato agli oggetti e se è più procedurale.

Personalmente non mi interessa.

Sono consapevole del fatto che un tentativo / cattura è più lento e causa un calo delle prestazioni, ma se userò una dozzina di if per convalidare prima di poter fare quello che voglio fare, userò sempre un tentativo / cattura per risparmiare sul numero di righe di codice.

Rende la mia vita molto più semplice non dover convalidare nulla e se la dichiarazione fallisce, fai solo quello che avrei fatto nel mio blocco "else" ... nel mio blocco "catch".

A volte, ovviamente, allego alcune istruzioni if ??in un tentativo / cattura, ma comunque.

Uso un if quando c'è solo un piccolo numero di cose da validare (1 o 2) prima di fare ciò che devo fare.

C'è una cosa che non è stata menzionata qui.

Con un'istruzione if-else, ogni volta che il codice viene eseguito, almeno 1 condizione viene garantita per essere eseguita. Sono sicuro che tutti sappiamo come funziona un if-else-elseif, ma per essere chiari ... la parte if dell'istruzione verrà sempre valutata, se è falsa, allora la seguente else-if viene valutato e così via fino a quando solo else viene lasciato in valutazione.

Quindi l'utilizzo di un'istruzione if-else avrà un impatto sulle prestazioni. Non significativamente (nella maggior parte dei casi), ma ci vuole tempo CPU per eseguire le valutazioni.

istruzioni try-catch e correggimi se sbaglio, non essere considerato in fase di esecuzione fino a quando non sono richieste (ovvero viene generata un'eccezione). Quindi, semplicemente racchiudendo il codice in un try-catch non influirà sulle prestazioni fino a quando un'eccezione non viene effettivamente catturata da esso.

Inoltre, non è la presa che provoca il colpo di prestazione, ma il tiro.

E un punto importante da sottolineare è che le istruzioni try-catch non devono MAI essere utilizzate per la logica condizionale. Dovrebbero essere usati solo per quello per cui sono progettati: gestione delle eccezioni!

La cattura delle eccezioni è essenziale, se sai cosa farne. Se non hai modo di gestire correttamente l'eccezione, dovresti lasciarla andare, perché un po 'di codice più in alto nella catena potrebbe avere un modo migliore per gestirla.

Di solito è una buona idea avere un'eccezione al livello più alto della tua applicazione per catturare le eccezioni prima che vengano visualizzate dall'utente. In ASP.NET puoi farlo nell'evento Application_Error di global.asax. In altre lingue / ambienti lo faresti nel tuo ciclo principale, qualunque esso sia.

Ma nota, ci sono alcune eccezioni che è sempre meglio lasciare non rilevate. A volte, quando si verifica un'eccezione, è un indicatore che lo stato dell'applicazione è stato gravemente compromesso e di cui non ci si può fidare. L'unica cosa sicura da fare è uccidere e riavviare.

@PersonalPerson - Siamo spiacenti, ma questa è solo una codifica pigra. Invece di usare un try-catch perché ci sono troppe istruzioni if, perché non refactificare il codice (cioè mettere la logica di validazione nel suo metodo). Ciò manterrà il codice più pulito e leggibile e manterrà le migliori pratiche per le prestazioni.

Non tentare mai di scrivere il codice per ottenere il minor numero di righe. Questo finirà sempre male. Sicuramente puoi trovare un modo più elegante per scrivere qualcosa in cui i tuoi amici programmatori ooh e aah, ma rende le cose meno leggibili.

Lo giuro, ho già lavorato con il tuo codice e mi ha fatto male alla testa.

L'uso delle eccezioni è un metodo universale per avvisare l'altra parte del codice che qualcosa di sbagliato è accaduto in modo vagamente accoppiato. Immagina che se desideri gestire alcune condizioni eccezionali usando if .. nad else .. devi inserire in diverse parti del tuo codice alcune variabili arbitrarie e altre cose che probabilmente porterebbero facilmente ad avere il codice spaghetti subito dopo.

Supponiamo che tu stia usando qualsiasi libreria / pacchetto esterno e il suo autore ha deciso di inserire nel suo codice un altro modo arbitrario per gestire stati errati - ti costringerebbe ad adattarti al suo modo di gestirlo - per esempio dovresti verificare se particolari metodi restituiscono vero, falso o altro.

L'uso delle eccezioni rende la gestione degli errori molto più semplice - supponi che se qualcosa va storto - l'altro codice genererà un'eccezione, quindi impacchetterai il codice nel blocco try e gestirai la possibile eccezione a modo tuo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top