Vantaggi dell'estensione della classe Exception predefinita

3

Ho visto che è possibile estendere la classe Exception in PHP, abilitando uno a lanciare un'eccezione IncorrectParameterTypeException , o un'eccezione ValueOutOfRangeException (forse questi sono esempi sbagliati di eccezioni personalizzate ... Sono ancora imparando).

Ma mi stavo solo chiedendo, perché dovrei farlo? Includerei "Il parametro deve essere una stringa" (o qualunque sia l'errore) come il messaggio di Exception, quindi non è come se offrisse nuove informazioni.

È solo una cosa di leggibilità del codice, o mi sfugge qualcosa? Sto appena iniziando a conoscere le classi di eccezioni personalizzate, quindi sto assumendo quest'ultimo.

    
posta John Doe 30.10.2015 - 16:45
fonte

2 risposte

3

È utile in quanto è possibile aggiungere ulteriori informazioni che la classe di eccezioni di base non contiene.

Quindi puoi creare una classe NetworkException e questo conterrebbe informazioni sul codice di errore del socket e / o l'indirizzo di connessione di destinazione o qualsiasi altra cosa ti sia piaciuta. I chiamanti possono prendere questo e presentare informazioni migliori per la diagnosi dell'errore.

Tuttavia ora inizi ad entrare in un problema di analisi - perché preoccuparti di scrivere tutte queste informazioni e una nuova classe di eccezioni quando è probabile, il chiamante che cattura la tua eccezione scriverà semplicemente tutte le informazioni personalizzate in una stringa e la scaricherà nel registro file o visualizzalo come "informazione dettagliata" per l'utente - potresti anche scriverlo al membro della stringa delle classi di base e averlo fatto, salvando tutti un sacco di problemi.

Tuttavia, se si dispone di una classe di eccezioni personalizzata, il client può catturare solo quelli che gli interessa e consentire ad altri di continuare lo stack di chiamate per qualcun altro da gestire, ad esempio il chiamante potrebbe intercettare NetworkException quando l'utente fa clic su Connetti , ma lascia che OutOfMemoryException continui e ... beh, di solito si blocca il client.

Quindi è un po 'una di quelle aree in cui devi pensare seriamente al design, e spesso nessuna risposta che ti viene in mente è quella "giusta", nessuna è altrettanto buona. (ad esempio, ho uno strumento scritto in C #, e ci sono molte e molte classi di eccezioni di Microsoft che potrei prendere ... anche se prendo alcune classi di eccezioni speciali per determinate circostanze, tendo comunque a prenderle tutte e stampare il messaggio della classe base in ogni caso (o peggio - il messaggio di sorpresa, non andare lì) .Questo è uno strumento di amministrazione in modo da scrivere ogni messaggio di eccezione è ciò di cui ho bisogno e ogni eccezione di Microsoft contiene un messaggio con i dettagli voglio loggarmi quindi non mi interessa davvero la classe di eccezioni!

quindi dipende da te, anche se sconsiglio di creare un'enorme gerarchia di ereditarietà di ogni possibile errore, in questo modo si trovano molti problemi di manutenzione e documentazione.

    
risposta data 30.10.2015 - 17:32
fonte
1

Permette di avvolgere le eccezioni in un'eccezione più generica.

Diciamo che stai sviluppando una libreria per gestire i prodotti. Per supportare il maggior numero possibile di ambienti diversi, rendi flessibile il tuo sistema di accesso ai dati e consenti agli utenti della tua biblioteca di archiviare i dati in un database MySQL, in un file XML e in un file JSON e di "inserire" l'archiviazione corretta.

Il codice che funziona con la libreria potrebbe aver bisogno di intercettare le eccezioni che si verificano nella libreria per fornire un feedback significativo. Ad esempio, potrebbe voler "ripiegare" su una memoria locale quando la memoria reale non è disponibile. Per fare questo dovrebbe intercettare ogni tipo di eccezione che ha a che fare con lo storage, ma potrebbe non voler intrappolare qualcosa come NullPointerException o ObjectIsInAnInvalidStateToBePersistedException.

Quindi, si crea una generica DataStorageException. Ogni implementazione cattura le proprie eccezioni nei punti appropriati e racchiude tale eccezione nel generico DataStorageException. L'implementazione MySQL potrebbe intrappolare un CannotConnectToServerException o InvalidUserException mentre l'implementazione XML potrebbe voler rilevare DataFileNotFoundException.

Il consumatore della tua biblioteca ha semplicemente bisogno di intercettare le DataStorageException e non ha bisogno di conoscere l'implementazione.

Ti consente di richiedere informazioni aggiuntive.

È possibile definire eccezioni che richiedono informazioni da passare. Ad esempio, una dichiarazione ArgumentOutOfRangeException potrebbe essere forzata dal costruttore per fornire l'intervallo effettivo che è valido. La classe potrebbe quindi costruire dinamicamente il messaggio per l'eccezione in base a questi valori.

    
risposta data 30.10.2015 - 17:01
fonte

Leggi altre domande sui tag