2017-12-11 6 views
0

In Elixier Sie eine benutzerdefinierte Ausnahme wie folgt definieren:Benutzerdefinierte Ausnahmen und Typ-Spezifikationen

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

Aber dies ist kein Elixir.Exception mehr

Also, wenn Sie es mit einem Dritten Bibliothek, die dies hat verwenden Art von Typ-Spezifikation definiert:

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

    ... 

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

die dialyzer mit breaks the contract abstürzt, weil die Custom keine Ausnahme:

Der Aufruf 'Elixir.Sentry': capture_exception ('Elixir.AppWeb.CustomError' [{ 'stacktrace' [{Atom() Atom(), [any()] | Byte(), [{'Datei', Zeichenfolge()} | {'line', pos_integer()}}}}, ...]) bricht den Vertrag ('Elixir.Exception': t(), 'Elixir.Keyword': t()) -> task()

Können Sie das Modul Elixir.Exception innerhalb von AppWeb.CustomError erweitern? oder wie kann dies nach den besten Praktiken erfolgen?

+0

Funktioniert 'Sentry.capture_exception (% AppWeb.CustomError {}, ...)? – Dogbert

Antwort

2

Sie übergeben den Modulnamen (AppWeb.CustomError) anstelle einer Instanz davon (%AppWeb.CustomError{}). Eine Instanz des Moduls erfüllt den Typ Exception.t.

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