在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
模块?或者如何按照最佳做法加以注意?
答案 0 :(得分:3)
您传递的是模块名称(AppWeb.CustomError
)而不是其实例(%AppWeb.CustomError{}
)。模块的实例将满足Exception.t
类型。
Sentry.capture_exception(%AppWeb.CustomError{},
[stacktrace: System.stacktrace()]