Come chiamare un'eccezione in cui la condizione non è eccezionale

3

NOTA: questa domanda riguarda la ricerca di un nome appropriato per un'eccezione in cui la condizione per generare l'eccezione non è effettivamente avvenuta (ad esempio impedire un StackOverflow lanciando un StackOverflowException prima di un overflow verificare)

Ho una classe FooList che ha limiti sul numero di elementi che può contenere. Il costruttore prende un elenco iniziale di elementi e altri elementi possono essere aggiunti, fino al limite.

La domanda che ho è questa. Avere un FooList completo non è eccezionale. Ho deciso che sarebbe probabilmente meglio se avessi fornito al client un modo per verificare se c'era spazio nella FooList prima di provare ad aggiungervi qualcosa ( hasRoom ). Tuttavia, questo non impedisce loro di chiamare add senza prima verificare.

Ho deciso che in questo caso potrebbe essere opportuno lanciare un'eccezione. Tuttavia, non sono esattamente sicuro di come chiamarlo. Come ho affermato, avere un FooList completo non è particolarmente eccezionale ed è in effetti uno stato perfettamente valido. Quindi, lanciare un FooListFullException non sembra giusto. Tuttavia, anche il lancio di un UnableToAddFooToListBecauseFooListIsFullException non sembra corretto.

public class FooList {

    FooList(List<Foo> foos) {
        Objects.requireNonNull(foos);

        if (foos.size() > 6) {
            throw new IllegalArgumentException("foos must not contain more than 6 Foos");
        }

        if (foos.size() < 1) {
            throw new IllegalArgumentException("foos must contain at least 1 Foo");
        }

        this.foos = foos;
    }

    void add(Foo foo) {
        Objects.requireNonNull(foo);

        if (!hasRoom()) {
            throw new XException("no more room in list");
        }
    }

    boolean hasRoom() {
        return getNextEmptyIndex() != -1;
    }

    private List<Foo> foos;
}

In che modo posso denominare l'eccezione per indicare che un'operazione add non è in grado di completare, O, c'è un modo migliore per farlo attraverso l'utente / client?

    
posta Zymus 23.04.2016 - 05:39
fonte

4 risposte

7

Penso che tu stia guardando nel modo sbagliato.

Hai ragione nel dire che lanciare un'eccezione è la cosa giusta da fare. Il fatto che una lista completa sia uno stato valido ha però poco a che fare con l'eccezione.

L'eccezione in questa situazione viene utilizzata per evidenziare che lo stato transizione non è valido. Vale a dire, il chiamante sta cercando di trasferire l'oggetto da uno stato valido a uno stato non valido.

Non sono uno sviluppatore Java, quindi non so quale eccezione specifica da utilizzare in questo caso. Ma, in C #, InvalidOperationException è solo per questo genere di cose. La voce MSDN legge "L'eccezione che viene generata quando una chiamata al metodo non è valida per lo stato corrente dell'oggetto."

Ti consigliamo di seguire questo schema quando dai il nome alla tua eccezione. Assicurati che l'operazione non sia valida, non lo stato.

    
risposta data 23.04.2016 - 12:21
fonte
0

Le eccezioni sono probabilmente il modo migliore per andare. In questo modo, chiunque utilizzi la tua classe riceverà una notifica ben nota e standardizzata secondo cui ciò che stanno tentando è un no no.

Dovresti creare la tua eccezione personalizzata (ad esempio OverFooListLimitException ). Includere Eccezione alla fine del nome della classe di eccezioni personalizzate, in modo che tutti coloro che lo vedranno conosceranno lo scopo di questa classe.

public class MyOwnException extends Exception {
    public MyOwnException () {

    }

    public MyOwnException (String message) {
        super (message);
    }

    public MyOwnException (Throwable cause) {
        super (cause);
    }

    public MyOwnException (String message, Throwable cause) {
        super (message, cause);
    }
}

Sostituisci MyOwnException con qualsiasi nome tu definisca l'eccezione personalizzata.

Esempio di eccezione personalizzata proviene da Come creare un tipo di eccezione personalizzato in Java?

    
risposta data 23.04.2016 - 06:00
fonte
0

Una Java coda con un limite di capacità lancia un IllegalStateException . Personalmente, sembra una scelta scadente di eccezione da buttare, ma potresti volerlo fare per essere "compatibile". Se crei la tua Eccezione, prendi in considerazione l'estensione di IllegalStateException.

    
risposta data 23.04.2016 - 08:10
fonte
0

Se dovessi usare un'eccezione in questo caso, la terrei il più semplice possibile e la chiamerei qualcosa come ContainerFullException o ListCapacityExceededException .

Tuttavia, non sono sicuro che sia la scelta migliore qui. Dato che hai indicato che l'elenco è pieno è non eccezionale, potrebbe essere un buon indicatore per non usare un'eccezione. Le eccezioni possono essere costose da buttare (stack unwinding, ecc.) E possono, IMO, portare a un codice di chiamata più complesso.

Potrebbe add() sul tuo elenco semplicemente restituire un boolean che è vero se l'elemento è stato aggiunto e falso in altro modo? Cosa dovrebbe fare il codice di chiamata se la lista è piena? Se il valore che non è stato possibile aggiungere deve essere salvato per riprovare più tardi, questo sarebbe più pulito quando si lavora con un valore di ritorno rispetto a provare a inserire la logica nel blocco catch .

    
risposta data 23.04.2016 - 09:23
fonte

Leggi altre domande sui tag