2015-04-20 6 views
22

W this article, to powiedział, że:Różnica między niezakończony zgonem i wyjątek w Scala

Jeśli chcesz złapać „wszystko”, które normalnie zdarzyć, a następnie użyć niezakończony zgonem:

import scala.util.control.NonFatal 

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

Ale ja zwykle korzystam Exception:

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

Chciałbym wiedzieć, jaka jest różnica między NonFatal i Exception w Scala? Czy Exception w Scali zawiera fatalny wyjątek?

AFAIK w języku Java, Exception jest przeznaczony dla błędu nie powodującego krytycznego wypadku, a Error oznacza błąd krytyczny. Czy scala różni się od java pod nazwą Exception?

Która z metod jest właściwa do przechwycenia wyjątku nie powodującego śmierci?

Odpowiedz

23

NonFatal jest tylko wygodny wyciąg, który jest zdefiniowany w 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 
} 

Nie ma specjalnego „fatal” rodzaj wyjątków JVM - Error y nie zawsze są „krytyczny”, są one po prostu szczególny rodzaj wewnętrznych wyjątków. Wyjątki "krytyczne" to tylko lista wyjątków używanych w definicji NonFatal. W tej terminologii wszystkie z wyjątkiem InterruptedException uważa się za nie-śmiertelne. Sensowne jest uznanie za nieważne, ponieważ oznacza to, że wątek został przerwany, więc jeśli chcesz go obsłużyć, powinieneś zrobić to jawnie.

NonFatal ekstraktor obsługuje również prawidłowo ControlThrowable s. Są to wyjątki, które są wywoływane przez specjalne funkcje przenoszenia sterowania, takie jak break wewnątrz breakable.

+1

Nie jestem jeszcze całkiem jasny, więc 'NonFatal' i' Exception' są mniej więcej takie same? – null

+1

Nie. Kiedy pasujesz do 'e: Exception', sprawdzasz rzeczywisty typ wyjątku, podobnie jak' catch (Exception e) 'w Javie. Jeśli wyjątek jest podklasą wyjątku, wyjątek zostanie przechwycony. Z kolei 'NonFatal' jest obiektem ekstraktora, który wykonuje dodatkową logikę na dopasowanej wartości. W tym przypadku 'NonFatal (e)' będzie pasować (i wychwycić wyjątek) tylko wtedy, gdy 'NonFatal.apply (e)' zwraca 'true'. Kiedy zwraca 'true', możesz zobaczyć w kawałku kodu powyżej. –

+0

Powinieneś przeczytać samouczek dotyczący ekstraktorów, taki jak [this] (http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html) jeden, jeśli nie wiesz, co to jest. –

Powiązane problemy