自定义例外和类型规范

时间:2017-12-11 11:13:06

标签: elixir phoenix-framework dialyzer

在elixir中,您可以定义一个自定义异常,如下所示:

defmodule AppWeb.CustomError do
  defexception message: "some custom server error", plug_status: 500
end

但这不再是Elixir.Exception

因此,如果您将其与第三方库一起使用,该第三方库已定义了此类型规范:

  @spec capture_exception(Exception.t, Keyword.t) :: task
  def capture_exception(exception, opts \\ []) do

  ...

  Sentry.capture_exception(AppWeb.CustomError,
                         [stacktrace: System.stacktrace()]

dialyzer将与breaks the contract一起崩溃,因为CustomError不是异常:

  

电话   'Elixir.Sentry':capture_exception( 'Elixir.AppWeb.CustomError',[{ '堆栈跟踪',[{原子(),原子(),[任何()]   | byte(),[{'file',string()} | {'line',pos_integer()}]}]},...])休息   合同('Elixir.Exception':t(),'Elixir.Keyword':t()) - >任务()

你能不能在Elixir.Exception内扩展AppWeb.CustomError模块?或者如何按照最佳做法加以注意?

1 个答案:

答案 0 :(得分:3)

您传递的是模块名称(AppWeb.CustomError)而不是其实例(%AppWeb.CustomError{})。模块的实例将满足Exception.t类型。

Sentry.capture_exception(%AppWeb.CustomError{},
                         [stacktrace: System.stacktrace()]