2016-11-27 19 views
2

"ページが見つかりません"と "リソースが見つかりません"というエラーを区別したいと思います。 例外タイプを次のようにすることは可能ですか?Phoenixでのエラー処理

def render("404.json", assigns) do 
    case assigns[:reason] do 
    NoRouteErro -> message = "Route not found" 
    Ecto.NoResultsError -> message = "Resource not found" 
    _ -> message = "Uncaught exception" 
    end 
    ContactService.ResponseHelper.error(message) 
end 

答えて

1

これはほぼ正しいです。あなたが照合しているパターンが正しくありません。構造体の構造体の型をcaseと一致させるには(structの任意のフィールドの値を無視する)、構造体のモジュール名の後に% beforeと{}を使用する必要があります。また、caseの外で課題を実行して、Elixirの「安全でない変数」の警告を防止する必要があります。また、assigns[:reason]を使用する代わりに、機能ヘッドでパターンマッチングに切り替えました。

決勝コード:

$ curl -H 'Accept: application/json' http://localhost:4000/404 
{"error":"Route not found"} 
$ curl -H 'Accept: application/json' http://localhost:4000/api/contacts/1 
{"error":"Resource not found"} 
:このコードで

def render("404.json", %{reason: reason}) do 
    message = case reason do 
    %Phoenix.Router.NoRouteError{} -> "Route not found" 
    %Ecto.NoResultsError{} -> "Resource not found" 
    _ -> "Uncaught exception" 
    end 
    # ContactService.ResponseHelper.error(message) 
    %{error: message} 
end 

、私は次のような結果を得ます