Domanda

Sto passando da mysql semplice in php a DOP e ho notato che il modo più comune per testare gli errori è usare una combinazione try / catch anziché combinazioni if ??/ else.

Qual è il vantaggio di quel metodo, posso usare un blocco try / catch invece di diversi blocchi nidificati if / else per gestire tutti gli errori per i diversi passaggi (connessione, preparazione, esecuzione, ecc.)?

È stato utile?

Soluzione

Userei il blocco try / catch quando il normale percorso attraverso il codice dovrebbe procedere senza errori a meno che non ci siano veramente alcune condizioni eccezionali - come il server inattivo, le tue credenziali scadute o errate. Non lo userei necessariamente per gestire errori non eccezionali - diciamo come se l'utente attuale non avesse il ruolo corretto. Cioè, quando puoi ragionevolmente aspettarti e gestire un errore che non è una condizione eccezionale, penso che dovresti fare i tuoi controlli.

Nel caso in cui tu abbia descritto - impostare ed eseguire una query, un blocco try / catch è un modo eccellente per gestirlo come normalmente ti aspetti che la query abbia successo. D'altra parte, probabilmente vorrai verificare che il contenuto del risultato sia quello che ti aspetti dalla logica del flusso di controllo piuttosto che tentare semplicemente di utilizzare dati che potrebbero non essere validi per il tuo scopo.

Una cosa da cercare è l'uso sciatto di try / catch. Try / catch non dovrebbe essere usato per proteggerti da una cattiva programmazione - il " Non so cosa succederà se lo faccio, quindi lo avvolgerò in un try / catch e spero per il meglio " tipo di programmazione. In genere è necessario limitare i tipi di eccezioni rilevate a quelle non correlate al codice stesso (server inattivo, credenziali errate, ecc.) In modo da poter trovare e correggere errori correlati al codice (puntatori null, ecc. .).

Altri suggerimenti

In generale, i blocchi try-catch sono fantastici perché si rompono (si spostano sull'istruzione catch) ogni volta che si verifica un'eccezione. I blocchi if-else si basano sulla previsione di quando si verificherà l'errore.

Modifica: Inoltre, i blocchi catch non impediranno l'arresto del codice in caso di errore.

Il vantaggio di try / catch e le eccezioni in generale è maggiore per le persone che sviluppano librerie come DOP. Consentono a uno sviluppatore di sistemi di gestire situazioni indefinite o risultati imprevisti in modo rapido e semplice. Prendi una connessione al database. Cosa dovrebbe fare un sistema se non è possibile raggiungere il database. Dovrebbe interrompere l'esecuzione? Riprova? Gettare un avvertimento e continuare? Lo sviluppatore del sistema non può sapere che cosa ti servirà, generano un'eccezione, che in seguito catturerai e gestirai.

Il vantaggio per te, in quanto consumatore del sistema è piuttosto che recuperare un vago codice di errore, o un semplice falso booleano che ha fallito, ottieni un oggetto Exception che

  1. Essere nominato in modo tale che sia più ovvio ciò che è andato storto (se ricordo bene, PDO ha solo un tipo di eccezione, ma altri sistemi contengono più tipi di eccezione per diversi tipi di errori)

  2. Può / dovrebbe contenere metodi e proprietà che possono aiutarti a capire perché è stata generata l'eccezione

Questa è comunque la teoria. Ci sono molte persone intelligenti che affermano che le eccezioni sono la strada da percorrere. Ci sono anche molte persone intelligenti che pensano che le eccezioni siano il diavolo e una stampella per gli sviluppatori di sistemi pigri. Non c'è nulla di simile al consenso su questo problema.

Try / Catch separa totalmente la logica di gestione degli errori dalla logica aziendale dell'oggetto.

Lanciare e catturare un'eccezione è un'operazione costosa rispetto alla maggior parte delle altre operazioni primitive. Se questo è un pezzo di codice che deve funzionare bene (ad esempio, in un ciclo stretto), ti consigliamo di guardare il tuo caso d'uso - se ti aspetti che le eccezioni vengano lanciate relativamente spesso, starai meglio con un if / else per quanto riguarda le prestazioni (a meno che il codice sottostante non stia semplicemente avvolgendo un'eccezione per te, nel qual caso non c'è alcun guadagno). Se le eccezioni vengono generate solo in rare circostanze, allora stai meglio con un tentativo / cattura per evitare il sovraccarico di ramificazioni in un ciclo stretto.

@Perchik:

La mia filosofia generale di gestione degli errori:

dovresti usare if / else per gestire tutti i casi che ti aspetti. Dovresti non usare try {} catch {} per gestire tutto (nella maggior parte dei casi) perché potrebbe essere sollevata un'eccezione utile e puoi conoscere la presenza di un bug da esso. dovresti usare try {} catch {} in situazioni in cui sospetti che qualcosa possa / andrà storto e non vuoi che distrugga l'intero sistema, come timeout di rete / problemi di accesso al file system, i file non esistono, ecc.

Eccezioni vessanti

Questo è esattamente il vantaggio, usando una dichiarazione try / catch anziché più istruzioni if. Sarai anche in grado di rilevare eventuali errori imprevisti.

Poiché PDO utilizza oggetti, generano eccezioni in caso di errore. I vecchi mysql / mysqli erano semplici funzioni e non generavano eccezioni, ma semplicemente restituivano codici di errore. Try / catch viene utilizzato quando un'eccezione può essere generata dal codice e viene rilevata nella clausola catch, che è un modo orientato agli oggetti per gestire gli errori. Non puoi catturare le eccezioni con i blocchi if / else: non condividono nulla con try / catch.

Tutti gli altri avevano buone risposte, ma ho pensato che avrei buttato le mie:

  1. Try / Catch è un vero meccanismo di gestione delle eccezioni, quindi se modifichi le eccezioni, funzionerà automaticamente su tutte le istruzioni try / catch.
  2. Try / Catch offre l'opportunità di eseguire il codice anche nel caso di un'importante eccezione che potrebbe uccidere if / else e inoltre, è possibile eseguire il rollback dell'istruzione try (se si è esperti).

In php usando Try Catch con ereditarietà, possiamo generare eccezioni da un'altra classe.

Esempio: - Sono nel controller e sto convalidando i dati dell'utente usando Modelli .

Se si verifica un errore, devo solo gettare un'eccezione dai metodi Model .

L'esecuzione in try verrà interrotta e catturata nel blocco Catch .

Quindi c'è meno sovraccarico nel restituire valori bool e controllarlo.

A parte questo Try Catch funziona alla grande quando si usa in catena ( Try - Catch all'interno di un altro Try - Catch ).

Completamente d'accordo con @Jared Updike

Di solito la gestione delle eccezioni viene fatta con l'utente che ne sa poco o nulla. D'altra parte, l'utente del sistema sa cosa succede all'interno di un blocco if-else.

ad es. Dovrebbe essere un "altro". clausola che mostra un utente ATM, il messaggio "Insufficiente saldo bancario" quando il suo equilibrio è basso. E questo messaggio NON PU be essere inserito all'interno di un "catch" bloccare per qualsiasi motivo !!

Diciamo che stiamo scrivendo un codice di divisione a / b e si è verificato il caso di eccezione più famoso, ovvero 0 errore di divisione, cosa pensi che possa essere fatto dopo?  1. È possibile stampare un messaggio ed uscire.  2. È possibile stampare un messaggio e consentire all'utente di immettere nuovamente i valori, ecc.

Ci sono casi in cui persone / fornitori diversi vogliono gestire lo stesso caso di eccezione in modo diverso. Il blocco catch consente loro di farlo facilmente. Se è necessario modificare la modalità di gestione di un determinato caso di eccezione, è sufficiente modificare il blocco catch.

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