In den meisten Anwendungen werden einige Fehler ausgelöst, die nicht mit möglichen
Bugs in Ihrem Code zusammenhängen, sondern einfach passieren, wenn Ihre App mit der
realen Welt in Kontakt kommt. Bots können vorbeischauen und versuchen, automatisch
Formulare zu senden, veraltete Links können Besucher zu nicht mehr existierenden Inhalten
führen und so weiter.
Um zu verhindern, dass diese Fehler in AppSignal als Probleme ausgegeben werden, ist es möglich,
Ihrem Code Ausnahmebehandlung hinzuzufügen oder AppSignal sogar bestimmte Fehler vollständig
ignorieren zu lassen.
Fehler ignorieren
Die AppSignal-Konfiguration ermöglicht es, Fehler zu
ignorieren. Indem Sie eine Liste
spezifischer Fehler bereitstellen, sendet AppSignal keine Warnungen, wenn diese Fehler ausgelöst werden.
Appsignal.set_error/3
Wenn Sie Ausnahmen in Ihrer Anwendung abfangen möchten, um Abstürze zu verhindern, aber
das Auftreten dennoch verfolgen möchten, können Sie
Appsignal.set_error/2 verwenden, um die Ausnahme zur
aktuellen AppSignal-Transaktion hinzuzufügen:
try do
raise "Exception!"
rescue
exception -> Appsignal.set_error(exception, __STACKTRACE__)
end
Erlang
Die AppSignal-Integration tut ihr Bestes, um aus Erlang ausgelöste Fehler in Elixir-Ausnahmen umzuwandeln. Zum Beispiel wird ein :badarg,
das von Erlang ausgelöst wird, automatisch in einen ArgumentError umgewandelt. Manchmal ist das Beste jedoch, den ursprünglich von Erlang stammenden Fehler in einen ErlangError einzuwickeln.
Da diese keinen großen Einblick in das zugrunde liegende Problem bieten, empfehlen wir, Informationen aus Ihrer Anwendung heraus hinzuzufügen, indem Sie den Fehler abfangen, selbst eine Elixir-Ausnahme erstellen und diese mit der Funktion set_error/2 der aktuellen Span hinzufügen.
HINWEIS: Appsignal.set_error/2 wurde in AppSignal für Elixir 2.1.0 hinzugefügt. Wenn
Sie eine niedrigere Version verwenden, verwenden Sie stattdessen Appsignal.set_error/3.
In Versionen vor 2.1.0 verwenden Sie catch und Appsignal.send_error/3:
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.set_error(kind, reason, __STACKTRACE__)
end
Die Ausnahme wird von AppSignal wie jeder andere Fehler verfolgt, und es ermöglicht Ihnen,
benutzerdefinierte Fehlerbehandlung und Fallbacks bereitzustellen.
Wenn Sie beim Aufruf von send_error kein Fehlerobjekt haben, aber das Szenario dennoch als Fehler melden möchten, ist es auch möglich, eine benutzerdefinierte Fehler-Struct zu initialisieren.
defmodule MyCustomError do
defexception message: "default message" # Customize if you call it without a custom message
end
case Worker.do_something() do
:ok -> IO.puts "yay!"
{:error, message} ->
Appsignal.set_error(:error, %MyCustomError{ message: message }, [])
end
Hinweis: Diese Funktion funktioniert nur, wenn eine AppSignal-Transaktion aktiv ist.
Andernfalls wird der Fehler ignoriert.
Bitte beachten Sie
Appsignal.send_error/3 zum Senden von Fehlern
ohne eine AppSignal-Transaktion.
Appsignal.send_error/3
AppSignal bietet einen Mechanismus, um Fehler zu verfolgen, die in Code auftreten, der sich nicht in
einem Web- oder Hintergrund-Job-Kontext befindet, wie z. B. Mix-Tasks. Dies ist nützlich für
Instrumentierung, die nicht automatisch AppSignal-Transaktionen zum Profilieren erstellt.
Sie können die Funktion Appsignal.send_error/3 verwenden, um
eine Ausnahme direkt von jeder Stelle in Ihrem Code an AppSignal zu senden, ohne
zuvor eine AppSignal-Transaktion zu starten.
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.send_error(kind, reason, __STACKTRACE__)
end
Wenn Sie beim Aufruf von send_error kein Fehlerobjekt haben, aber das Szenario dennoch als Fehler melden möchten, ist es auch möglich, eine benutzerdefinierte Fehler-Struct zu initialisieren.
defmodule MyCustomError do
defexception message: "default message" # Customize if you call it without a custom message
end
case Worker.do_something() do
:ok -> IO.puts "yay!"
{:error, message} ->
Appsignal.send_error(:error, %MyCustomError{ message: message }, [])
end
Um Metadaten zum gesendeten Fehler hinzuzufügen, übergeben Sie eine Funktion als viertes Argument an
Appsignal.send_errror/4:
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.send_error(kind, reason, __STACKTRACE__, fn span ->
Appsignal.Span.set_attribute(span, "key", "value")
end)
end
HINWEIS: Appsignal.send_error/4 wurde in AppSignal für Elixir 2.1.0 hinzugefügt.