如何在case语句或控制器中使用__STACKTRACE__

Van*_*ssa 6 elixir phoenix-framework rollbar

我在Phoenix应用程序中遇到过时警告System.stacktrace/0 outside of rescue/catch clauses is deprecated. If you want to support only Elixir v1.7+, you must access __STACKTRACE__ inside a rescue/catch. If you want to support earlier Elixir versions, move System.stacktrace/0 inside a rescue/catch

事实是,我按照他们的文档中所述使用Rollbax:将Rollbax.report(:error, ArgumentError.exception("oops"), System.stacktrace())我正在执行的每个case语句包装在try / rescue块中感觉有点奇怪。例如这个:

case (SOME_URL |> HTTPoison.get([], [ ssl: [{:versions, [:'tlsv1.2']}] ])) do
      {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
        Poison.decode!(body, [keys: :atoms])
      {:ok, %HTTPoison.Response{status_code: 404}} ->
        Rollbax.report(:error, :not_found, System.stacktrace(), %{reason: "Not found"})
      {:ok, %HTTPoison.Response{status_code: 503}} ->
        {:error, :ehostunreach}
      {:error, %HTTPoison.Error{reason: :ehostunreach}} ->
        {:error, :ehostunreach}
      {:error, %HTTPoison.Error{reason: :timeout}} ->
        Rollbax.report(:error, :timeout, System.stacktrace(), %{reason: :timeout})
      {:error, %HTTPoison.Error{reason: reason}} ->
        Rollbax.report(:error, :unknown, System.stacktrace(), %{reason: reason})
        {:error, reason}
    end
Run Code Online (Sandbox Code Playgroud)

我不确定如何一次就能获得这些不同的报告。写这份报告的正确方法是什么?

Ale*_*kin 3

总结一下整个case声明:

\n\n\n\n
try do\n  #                           \xe2\x87\x93\xe2\x87\x93\xe2\x87\x93\xe2\x87\x93 NOTE BANG\n  case (SOME_URL |> HTTPoison.get!([], [ ssl: [{:versions, [:\'tlsv1.2\']}] ])) do\n    %HTTPoison.Response{status_code: 200, body: body} ->\n      Poison.decode!(body, [keys: :atoms])\n    %HTTPoison.Response{status_code: 404} ->\n      raise HTTPoison.Error, reason: :not_found\n    %HTTPoison.Response{status_code: 503} ->\n      {:error, :ehostunreach}\nrescue\n  e in [HTTPoison.Error] ->\n    case e do\n      %HTTPoison.Error{reason: :not_found} ->\n        Rollbax.report(:error, :not_found, __STACKTRACE__, %{reason: "Not found"})\n      %HTTPoison.Error{reason: :ehostunreach} ->\n        {:error, :ehostunreach}\n      %HTTPoison.Error{reason: :timeout} ->\n        Rollbax.report(:error, :timeout, __STACKTRACE__, %{reason: :timeout})\n      %HTTPoison.Error{reason: reason} ->\n        Rollbax.report(:error, :unknown, __STACKTRACE__, %{reason: reason})\n        {:error, reason}\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n