Zum Hauptinhalt springen
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

Zusätzliche Metadaten

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.