2017-10-04 4 views
0

Alors que Elixir nous encourage à ne pas utiliser de blocs try/catch il y a des moments où ils sont nécessaires. Dans une application que j'ai écrite, j'ai le try/catch suivant qui fonctionne.Elixir: essayer d'attraper les signaux de sortie

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

Dans la section de capture j'ai changé :exit, - à {:exit, _} pensant qu'ils étaient la même chose et qui a donné lieu à briser le code.

Ma question est ce qui est :exit, _

Il ne seam pas être un tuple, liste, etc. Même quand je _ il ne correspond pas. Est-ce que attraper une macro qui attend des paramètres?

+0

Pertinent: Ma réponse sur les 3 types d'exceptions dans Erlang: https://stackoverflow.com/a/45973542/320615 – Dogbert

Répondre

1

Elixir est open source et possède une documentation presque parfaite. La sous-section catching throws and exits révèle le tout.

Oui, tryis a macro est incorporé par le compilateur et en fonction de la signature de la clause est transpiled to either :throw, _ or to _, _.

+0

Merci pour les liens. Je suppose qu'une partie de ma question, la surprise, était que je m'attendais à un appariement de motifs dans la section catch, et donc un type Elixir comme un tuple, mais parce que c'est une macro, il attend deux arguments. Je suis d'accord que la documentation est bonne, mais pour un noop plus fin les détails peuvent encore être non évidents. Merci encore pour votre réponse. – bexley