Quanti dati devono contenere le eccezioni?

4

Quasi tutte le eccezioni che ho scritto sono state molto leggere, contenenti un messaggio String e facoltativamente un throwable. In alcune situazioni ho incluso qualche enum specifico dell'applicazione o qualche altro campo.

public class MySpecialException()
{
    private MyErrorCode errorCode;

    public MySpecialException(String message, Throwable cause, MyErrorCode errorCode)
    {
        super(message, cause);
        this.errorCode = errorCode;
    }

    ....
}

Ora devo affrontare una situazione in cui devo inserire 5 o 6 campi nell'eccezione perché il gestore degli errori che li intercetta ha bisogno di loro per generare l'output.

Lo consideri un codice errato? Può un'eccezione essere troppo grande?

public class MySpecialException()
{
    private String name;
    private int age;
    private int id;
    private int height;
    private String duck;
    private String whatever;

    ....
}
    
posta Adam 24.07.2014 - 14:43
fonte

4 risposte

9

Ovviamente può essere troppo grande - praticamente tutto ciò che riguarda la codifica è un compromesso tra principi diversi, e non sprecare memoria è uno di questi.

Tuttavia, se hai bisogno dei dati nell'eccezione per portare a termine il lavoro, per definizione è non troppo grande. Sarebbe troppo grande solo se esistesse un altro meccanismo che realizza lo stesso, porta a un codice gestibile e funziona come un'eccezione.

Ma le eccezioni sono elementi del linguaggio di prima classe che sono stati inventati specificamente per ottenere qualcosa che altrimenti non si può fare (interrompere il flusso di controllo e trasferire dati da qualche altra parte nello stack di chiamate senza dover cambiare i chiamanti intermedi), quindi dubito che potresti trovare un'altra soluzione che soddisfa questa condizione.

    
risposta data 24.07.2014 - 14:51
fonte
1

Un'eccezione può essere troppo grande, specialmente se si intende serializzarlo e trasferirlo su un cavo (ad esempio a un client / server remoto oa un database).

Se si trova sulla stessa macchina, e non lo stai spingendo, metti quei 5-10 valori lì. O forse ha più senso metterli nella propria classe (es). Forse non hai a che fare con un'eccezione qui, ma un'eccezione che trasporta informazioni su una persona e un'anatra.

    
risposta data 24.07.2014 - 23:03
fonte
0

Penso che tu non abbia davvero bisogno di tutte quelle informazioni. Suppongo che tu abbia bisogno di tutti questi valori per identificare meglio la causa del fallimento, quindi hai diverse opzioni per raggiungere questo obiettivo, o almeno migliorare la soluzione attuale:

  • Utilizza un registratore. È possibile accedere a un file o a un database questi valori prima di lanciare l'eccezione
  • Memorizza l'ID e recupera manualmente l'entità in seguito, se è archiviata in un luogo accessibile come un database
  • Passa all'eccezione solo i valori che sono la causa degli errori

Ad ogni modo, non memorizzare questi valori all'interno dell'eccezione, ma usali per creare il messaggio di eccezione nel costruttore.

    
risposta data 24.07.2014 - 14:54
fonte
0

No, un'eccezione non può essere troppo grande (beh, ovviamente potrebbe, ma sto assumendo il buon senso qui). Quel che un'eccezione può sicuramente essere è troppo abbinato alla normale logica del programma.

Le eccezioni dovrebbero mai essere utilizzate per trasmettere informazioni nel tuo programma. dovrebbero essere usati solo per condizioni di errore che non ci si aspetta di dover affrontare (di nuovo, il buon senso dice che includerà errori che si aspettavano, ma quelli che non si verificano molto spesso).

Quindi quando trasmetti tutte queste informazioni in un'eccezione, chiedi che cosa hai intenzione di fare con essa. Se l'eccezione è il driver solo da circostanze eccezionali, in genere si desidera che sia il più semplice e generico possibile - il suo compito è quello di dirti cosa è andato storto e possibilmente alcune ulteriori informazioni che è possibile visualizzare all'utente. Cercando di utilizzare le informazioni per qualsiasi altro scopo odori come se steste cercando di utilizzare le eccezioni per gestire i casi.

Aggiungendo un gestore di eccezioni che capisce tutte le eccezioni che potresti lanciare significa che il tuo gestore diventa molto legato alle tue classi di eccezioni e questo significa che il tuo gestore non può trovarsi in una libreria autonoma senza fare riferimento all'applicazione! Quando i progetti crescono, scoprirai che questo diventa un fastidioso problema.

Quindi, non lo farei. Mi limiterei a lanciare eccezioni come stringhe e codici. Se devi veramente passare informazioni sull'errore (ad es. Quale utente è stato processato), tieni un log di errore (o transazione) contenente i dati e usalo dopo che l'eccezione è gestita per gestire i dati - puoi sperare di mettere il generatore di display in il codice dell'applicazione e tenerlo separato dai sistemi esterni.

    
risposta data 24.07.2014 - 23:13
fonte

Leggi altre domande sui tag