È buona norma utilizzare NoStackTrace in scala?


11

Mi sono imbattuto nel NoStackTracemixin per Eccezioni in scala.

È buona pratica usarlo o dovrebbe essere considerato "interno" a scala e lasciato solo?

Risposte:


14

Per un momento, andiamo allo Stack Overflow: quanto sono lente le eccezioni Java?

Si scopre che la parte costosa del lancio di eccezioni è la popolazione della traccia dello stack che accompagna l'eccezione.

Questa traccia dello stack è molto utile durante il debug dei problemi per cercare di capire da dove vengono chiamate le cose. Una delle domande standard poste sui problemi è "qual è il codice" e "qual è la traccia dello stack". Senza queste due cose, diagnosticare un problema è quasi impossibile.

Tuttavia, non tutte le eccezioni sono generate da problemi . Alcuni di loro, quasi te lo aspetti.

Considera la situazione in cui hai una stringa da qualche sorgente e vuoi riportarla in un formato intero con Integer.decode .

Integer foo = Integer.decode(str);

Ma questo decodegenera un controllo NumberFormatException. Ok...

Integer foo;
try {
    foo = Integer.decode(str);
} catch (NumberFromatException e) {
    // raise an error back to the input form
}

Ma davvero non ti interessa la traccia dello stack lì ... ma è lì. E solo un po 'più lento perché ha popolato la traccia dello stack.

Quindi, in Scala, hai il NoStackTrace:

Un tratto per le eccezioni che, per motivi di efficienza, non compilano la traccia dello stack. La soppressione della traccia dello stack può essere disabilitata su base globale tramite un wrapper di proprietà del sistema in scala.sys.SystemProperties.

Non popolare ciò che non ti serve. Non ti interessa la traccia dello stack perché la stai gestendo proprio lì e poi. Questo non è qualcosa che si sta perdendo, e non è neanche così eccezionale.

Non è una cattiva pratica usarlo quando sai cosa stai gestendo. Ma, se stai passando questo sulla catena - non usarlo - potresti dover semplicemente registrare da dove proviene un'eccezione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.