In de meeste applicaties worden er fouten gegenereerd die niet gerelateerd zijn aan
mogelijke bugs in uw code; ze gebeuren gewoon wanneer uw app in contact komt
met de echte wereld. Bots kunnen langskomen en automatisch formulieren proberen te
posten, verouderde links kunnen bezoekers naar inhoud verwijzen die niet meer
bestaat enzovoort.
Om te voorkomen dat deze fouten als problemen in AppSignal worden weergegeven, is het mogelijk
om exception handling aan uw code toe te voegen of zelfs AppSignal bepaalde fouten
volledig te laten negeren.
Fouten negeren
De AppSignal-configuratie maakt het mogelijk om fouten te
negeren. Door een lijst met
specifieke fouten op te geven, stuurt AppSignal geen meldingen wanneer deze fouten optreden.
Appsignal.set_error/3
Als u uitzonderingen in uw applicatie wilt opvangen om crashes te voorkomen, maar
toch het optreden ervan wilt bijhouden, kunt u
Appsignal.set_error/2 gebruiken om de uitzondering toe te voegen aan
de huidige AppSignal-transactie:
try do
raise "Exception!"
rescue
exception -> Appsignal.set_error(exception, __STACKTRACE__)
end
Erlang
De AppSignal-integratie doet zijn best om fouten die vanuit Erlang worden opgeworpen om te zetten in Elixir-uitzonderingen. Bijvoorbeeld: een :badarg
die vanuit Erlang wordt opgeworpen, wordt automatisch geconverteerd naar een ArgumentError. Echter, soms is het beste wat het kan doen het inpakken van de fout afkomstig uit Erlang in een ErlangError.
Aangezien deze niet veel inzicht geven in het onderliggende probleem, raden we aan om informatie toe te voegen vanuit uw applicatie door de fout op te vangen, zelf een Elixir-uitzondering te creëren en die toe te voegen aan de huidige span met de functie set_error/2.
OPMERKING: Appsignal.set_error/2 is toegevoegd in AppSignal voor Elixir 2.1.0. Als
u een lagere versie gebruikt, gebruik dan Appsignal.set_error/3 in plaats daarvan.
In versies vóór 2.1.0 gebruikt u catch en Appsignal.send_error/3:
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.set_error(kind, reason, __STACKTRACE__)
end
De uitzondering wordt door AppSignal getraceerd zoals elke andere fout, en het stelt
u in staat om aangepaste foutafhandeling en fallbacks te bieden.
Als u geen foutobject heeft wanneer u send_error aanroept, maar het scenario toch als een fout wilt rapporteren, is het ook mogelijk om een aangepaste foutstruct te initialiseren.
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
Opmerking: Deze functie werkt alleen wanneer er een AppSignal-transactie actief is.
Anders wordt de fout genegeerd.
Zie
Appsignal.send_error/3 voor het verzenden van fouten
zonder een AppSignal-transactie.
Appsignal.send_error/3
AppSignal biedt een mechanisme om fouten te traceren die optreden in code die zich niet in
een web- of background job-context bevindt, zoals Mix-taken. Dit is handig voor
instrumentatie die niet automatisch AppSignal-transacties aanmaakt om te
profileren.
U kunt de functie Appsignal.send_error/3 gebruiken om
direct een uitzondering naar AppSignal te sturen vanuit elke plek in uw code zonder
eerst een AppSignal-transactie te starten.
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.send_error(kind, reason, __STACKTRACE__)
end
Als u geen foutobject heeft wanneer u send_error aanroept, maar het scenario toch als een fout wilt rapporteren, is het ook mogelijk om een aangepaste foutstruct te initialiseren.
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
Om metadata aan de verzonden fout toe te voegen, geeft u een functie als vierde argument door aan
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
OPMERKING: Appsignal.send_error/4 is toegevoegd in AppSignal voor Elixir 2.1.0.