2015-04-20 13 views
22

In this article, si dice che:La differenza tra non-fatale ed eccezione in Scala

Se si desidera catturare “tutto” che normalmente accadere, quindi utilizzare non fatale:

import scala.util.control.NonFatal 

try { 
    operation() 
} catch { 
    case NonFatal(e) => errorHandler(e) 
} 

Ma io di solito uso Exception:

try { 
    operation() 
} catch { 
    case e: Exception => errorHandler(e) 
} 

Mi piacerebbe sapere qual è la differenza tra NonFatal e Exception in Scala? Lo Exception in Scala include un'eccezione irreversibile?

AFAIK in java, Exception è per errore irreversibile e Error è per errore irreversibile. Scala è diversa con java in termini di Exception?

Qual è il modo corretto per rilevare l'eccezione non fatale?

risposta

23

NonFatal è solo un estrattore di comodo che è definito in scala.util.control:

object NonFatal { 
    /** 
    * Returns true if the provided `Throwable` is to be considered non-fatal, or false if it is to be considered fatal 
    */ 
    def apply(t: Throwable): Boolean = t match { 
    case _: StackOverflowError => true // StackOverflowError ok even though it is a VirtualMachineError 
    // VirtualMachineError includes OutOfMemoryError and other fatal errors 
    case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable | _: NotImplementedError => false 
    case _ => true 
    } 
    /** 
    * Returns Some(t) if NonFatal(t) == true, otherwise None 
    */ 
    def unapply(t: Throwable): Option[Throwable] = if (apply(t)) Some(t) else None 
} 

Non v'è alcun tipo speciale "fatale" di eccezioni su JVM - Error s non sono sempre "fatale", sono solo un tipo speciale di eccezioni interne. Le eccezioni "fatali" sono solo un elenco di eccezioni utilizzate nella definizione NonFatal. In questa terminologia tutti gli Exception s tranne InterruptedException sono considerati non mortali. Ha senso considerare InterruptedException fatale perché significa che il thread è interrotto, quindi se vuoi gestirlo dovresti farlo esplicitamente.

NonFatal estrattore gestisce anche ControlThrowable s correttamente. Si tratta di eccezioni generate da speciali funzioni di trasferimento di controllo come break all'interno di breakable.

+1

Non sono ancora chiaro, quindi 'NonFatal' e' Exception' sono più o meno uguali? – null

+1

No. Quando si abbina a 'e: Exception' si sta verificando il tipo effettivo dell'eccezione, proprio come' catch (Exception e) 'in Java. Se l'eccezione è una sottoclasse di 'Exception', verrà rilevata l'eccezione. 'NonFatal', d'altra parte, è un oggetto estrattore che esegue una logica aggiuntiva sul valore corrispondente. In questo caso 'NonFatal (e)' corrisponderà (e rileverà l'eccezione) solo quando 'NonFatal.apply (e)' restituisce 'true'. Quando ritorna 'true' puoi vedere nel codice di cui sopra. –

+0

Dovresti leggere alcuni tutorial sugli estrattori, come [questo] (http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html) uno, se non sai cosa sono. –

Problemi correlati