2017-10-04 4 views
0

Während Elixir uns ermutigt, keine Try/Catch-Blöcke zu verwenden, gibt es Zeiten, in denen sie benötigt werden. In einer Anwendung, die ich geschrieben habe, habe ich den folgenden try/catch, der funktioniert.Elixier: Versuch, die Ausgangssignale zu fangen

try do 
    message = GenServer.call(via, :get_messages) 
    {:ok, message} 
catch 
    :exit, _ -> {:error, "Process uuid no longer exists"} 
end 

Im Rastabschnitt änderte ich :exit, - zu {:exit, _} denken, dass sie die gleiche Sache waren und führte den Code zu brechen.

Meine Frage ist, was :exit, _ ist

Es ist kein Tupel, Liste sein muss Naht etc. Auch wenn ich _ verwendet es nicht übereinstimmten. Ist ein Makro gefangen, das Parameter erwartet?

+0

Relevant: Meine Antwort auf die 3 Arten von Ausnahmen in Erlang: https://Stackoverflow.com/a/45973542/320615 – Dogbert

Antwort

1

Elixier ist Open Source und hat eine nahezu perfekte Dokumentation.

Kernel.SpecialForms.try/1 's Unterabschnitt auf catching throws and exits deckt die ganze Sache auf.

Ja, tryis a macro, das vom Compiler inline ist und abhängig von der Signatur der Klausel ist transpiled to either :throw, _ or to _, _.

+0

Danke für die Links. Ich vermute, ein Teil meiner Frage, Überraschung, war, dass ich einen Mustervergleich in der Catch-Section erwartete und daher einen Elixir-Typ wie Tupel, aber weil es ein Makro ist, erwartet es tatsächlich zwei Argumente. Ich stimme zu, dass die Dokumentation gut ist, aber für ein Noop können feinere Details immer noch nicht offensichtlich sein. Nochmals vielen Dank für Ihre Antwort. – bexley

Verwandte Themen