2016-10-27 3 views
9

Sowohl try/rescue als auch try/catch sind Fehlerbehandlungstechniken in Elixir. Entsprechend der corresponding chapter in der Einführung führen.Elixier - Versuch/Fang gegen Versuch/Rettung?

Fehler können

throw und catch sind reserviert für Situationen, in denen es nicht möglich ist, einen Wert abrufen, es sei denn durch die Verwendung mit dem try/rescue Konstrukt

Auf der anderen Seite, gerettet werden throw und catch.

Doubts

ich ein kurzes Verständnis habe, dass rescue für Fehler ist. Während catch ist für jeden Wert.

jedoch

  • Wann sollte ich Verwendung der Fehlerbehandlungsmechanismen in Elixir machen?
  • Was sind die Unterschiede zwischen ihnen im Detail?
  • Wie sollte ich einen auswählen, der in einem bestimmten Anwendungsfall verwendet wird?
  • Was genau sind 'die Situationen, in denen es nicht möglich ist, einen Wert abzurufen, außer mit throw und catch'?
+3

Sie sollten sie überhaupt nicht verwenden;) Es ist kein Java, dass Sie alle Fehler versuchen/fangen wollen. Sie sollten Supervisor verwenden, wenn ein Fehler aufgetreten ist, um Ihre App stabil zu machen, oder verwenden Sie die Raise, wenn ein Fehler auftritt. – PatNowak

+0

Mögliches Duplikat von [Welche Situationen erfordern Wurf/Fang im Elixier?] (Http://stackoverflow.com/questions/36036480/which-situations-require-throw-catch-in-elixir) –

Antwort

14

Es ist eine gute Frage.Nach der Forschung ein wenig.

  • Was sind die Unterschiede zwischen ihnen im Detail?

    José Antwort:

Vor allem sollten Sie throw für Kontrollfluss und Reserve raise für Fehler verwenden, die auf Entwickler Fehler oder unter außergewöhnlichen Umständen geschehen.

In Elixir ist diese Unterscheidung eher theoretisch, aber sie Materie in einige Sprachen wie Ruby, wo Fehler/Ausnahmen für Steuerfluss mit teuer, weil der Schaffung des Ausnahmeobjekts und Backtrace ist teuer.

  • Wie soll ich eine auswählen, in einem bestimmten Anwendungsfall zu benutzen?

Bitte überprüfen Sie diese Antwort Which situations require throw catch in Elixir

Kurz:

raise/rescue

Betrachten Sie heben/Rettung explizit über Ausnahme sein Handling (einige unerwartete Situation wie Programmierer Fehler, falsche Umwelt, etc).

throw/catch

ist nützlich, in Orte, wo man Ausfälle erwartet. Klassische Beispiele sind:

Die letzte one:

  • Was genau sind die Situationen, in denen es nicht möglich ist, einen Wert abzurufen, es sei denn, man benutzt "throw and catch"?
  • Nehmen wir an, Sie versuchen, Code aus einem Prozess auszuführen, der von einer Supervisor überwacht wird, aber der Prozess stirbt aus einem unerwarteten Grund.

    try do 
    IO.inspect MayRaiseGenServer.maybe_will_raise 
    rescue 
        RuntimeError -> IO.puts "there was an error" 
    end 
    

    MayRaiseGenServer wird von einem Supervisor überwacht und aus irgendeinem Grund wurde ein Fehler ausgelöst:

    try do 
    IO.inspect MayRaiseGenServer.maybe_will_raise # <- Code after this line is no longer executed 
    

    Und dann können Sie mit der Verwendung von Fang hier eine Ausnahme kommen:

    try do 
        IO.inspect MayRaiseGenServer.maybe_will_raise 
    catch 
        :exit, _ -> IO.puts "there was an error" 
    end 
    

    Ok .Hope, die genug klarstellen, was wir suchen.

    +1

    Vielen Dank für Ihre Forschung, gut Erklärung :) – Gavin

    +0

    Gern geschehen :) – TheAnh