Domanda

Lo so

throw new Exception();

ha un sovraccarico piuttosto elevato, poiché crea uno stackTrace completo, ecc.
Fa

throw new Throwable();

presenta lo stesso problema?Questo comportamento è ereditario o lanciare un Throwable ha un sovraccarico minore (o no)?

MODIFICARE
Da un analista Da questo punto di vista, un utente che inserisce una password errata costituisce un'eccezione al normale ordine di esecuzione di un programma.Quindi se ho:

public Session newSession() {  
  validate_user_and_password();   
}

lanciare una UserNotValidException sembrerebbe corretto da un analisti punto di vista.
Ritorno null O 0 sembra sbagliato se il tuo codice ha un'astrazione abbastanza buona.Volevo solo sapere se potevo effettivamente implementarlo nel codice o se dovevo lasciarlo alla teoria.

C'è una buona differenza tra l'eccezione dal punto di vista della programmazione e l'eccezione dal punto di vista dell'analista.

Nota:Ho fatto un esempio davvero semplice e sciocco, non è proprio il mio caso.
Nota 2:So che tornerò null sarebbe la cosa normale, ma mi viene richiesto di avere un codice adeguatamente astratto e OO e, personalmente, non vedo alcun danno in questo.

È stato utile?

Soluzione

Throwable crea anche uno stacktrace quando viene creato.Dal documenti Java per Throwable:

Throwable contiene uno snapshot dello stack di esecuzione del suo thread nel momento in cui è stato creato.

Quindi, in termini di sovraccarico per quanto riguarda la creazione di uno stacktrace, non dovrebbe esserci alcuna differenza tra Exception E Throwable.

Se stai utilizzando eccezioni per "eventi eccezionali" (come dovresti essere), non dovresti preoccuparti troppo del sovraccarico di uno stacktrace.Un evento eccezionale si verifica raramente durante l'esecuzione del codice.Pertanto le eccezioni non dovrebbero influire in modo significativo sulle prestazioni del codice normale.

Altri suggerimenti

No, hai bisogno della tua sottoclasse per evitare questo effetto.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

Ciò crea un'istanza di eccezione che non riempirà l'analisi dello stack (la creazione di eccezioni delegate a fillInStackTrace per riempire effettivamente l'analisi dello stack) ed è quindi economico da creare.

Con la compilazione JIT, in realtà non è ancora il caso che ci sia molto da sentire per lanciare un Exception a Giava.Ma lanciando a Throwable non è molto diverso, poiché anche lì otterrai uno stack trace.

Se sei interessato, c'è un documento molto interessante chiamato "Gestione efficiente delle eccezioni Java nella compilazione just-in-time" (collegamento).Non una lettura leggera, ma abbastanza istruttiva.

Non dovresti mai lanciare o prendere Throwable. La portata dell’eccezione è decisamente troppo ampia.

Come affermato in precedenza, le eccezioni dovrebbero essere utilizzate solo dove necessario, vale a dire:in circostanze eccezionali e dovrebbero essere specifici per la situazione che li ha generati.A parte questo, catturare a Throwable implica una serie di eccezioni, come OutOfMemoryException.Un errore di questa portata non può essere recuperato (facilmente) e non dovrebbe essere gestito dallo sviluppatore.

Throwable è la classe genitore di Exception.COSÌ Exception class è ereditato da Throwable.

Throwable vs. Exception

Eccezione Java

Come ha detto @mangoDrunk: "Throwable è la superclasse di eccezioni ed errori."

Puoi guardare il codice sorgente delle due classi per vederlo Exception non fa altro che esporre gli stessi costruttori di Throwable.Tutta la carne, e quindi le spese generali, vive Throwable.

Anche se Exception introducesse qualche sovraccarico aggiuntivo, sarebbe un'evidente ottimizzazione eccessiva da utilizzare Throwable Invece.Usa lo strumento giusto per il lavoro, non cooptare lo strumento sbagliato solo perché è più leggero.

java.lang.Exception si estende java.lang.Throwable, quindi è lo stesso sovraccarico.Dal Javadoc:

La classe Throwable è la superclasse di tutti gli errori e le eccezioni nel linguaggio Java.Solo gli oggetti che sono istanze di questa classe (o di una delle sue sottoclassi) vengono lanciati dalla Java Virtual Machine o possono essere lanciati dall'istruzione Java Throw.Allo stesso modo, solo questa classe o una delle sue sottoclassi può essere il tipo di argomento in una clausola catch.

Le istanze di due sottoclassi, Errore ed Eccezione, vengono convenzionalmente utilizzate per indicare che si sono verificate situazioni eccezionali.In genere, queste istanze vengono create di recente nel contesto della situazione eccezionale in modo da includere informazioni rilevanti (come i dati di stack trace).

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