Esta tradução de máquina é fornecida para sua comodidade.
In the event of any inconsistency between the English version and the translated version, the English versionwill take priority. Please visit this page for more information.
Os relatórios do agente .NET da New Relic trataram os erros como se fossem erros padrão. Isto é mais comum com funções de trabalhador do Azure, aplicações de consola, trabalho assíncrono e operações semelhantes.
Solução
Para evitar falsos relatórios de erros, utiliza-se um método que contém direta ou indiretamente o manipulador de exceções. instrumento o método alvo definindo um arquivo de instrumentação personalizada , ou envolvendo o método em uma transação customizada, conforme mostrado neste exemplo:
Neste exemplo, o New Relic relata um erro de GetResponse()unless o método Foo() é instrumentado. Contanto que Foo seja instrumentado, o New Relic inicia uma transação quando Foo é chamado e termina a transação quando Foo termina.
Como o erro é tratado antes do término de Foo , o New Relic não reportará um erro. Observe também que GetResponse() se torna um segmento da transação Foo .
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Threading;
usingSystem.Threading.Tasks;
usingSystem.Net;
usingSystem.IO;
namespaceErrorTester
{
classProgram
{
staticvoidMain(string[] args)
{
var i =0;
while(true)
{
Foo(++i);
}
}
staticvoidFoo(int i)
{
try
{
GetNotFound();
}
catch(Exception ex)
{
Console.WriteLine("Got it "+ i +"!");
Thread.Sleep(1000);
}
}
staticstringGetNotFound()
{
string uri ="https://localhost/Test/this/is/not/a/real/page";
var request =(HttpWebRequest)WebRequest.Create(uri);
var response = request.GetResponse();
var data =newStreamReader(response.GetResponseStream()).ReadToEnd();
Os únicos erros relatados pelo agente .NET da New Relic são erros não tratados que encerram uma transação. Se seu aplicativo chamar um manipulador de exceção antes do término da transação, o New Relic não reportará um erro.
No entanto, o New Relic nem sempre detecta manipuladores de exceção quando o erro ocorre fora de uma transação da web, transação WCF ou transação personalizada. Isso ocorre porque o agente cria “minitransações” para métodos instrumentados que não estão associados a uma transação.
Quando o método instrumentado termina, a minitransação termina. Se a minitransação gerar um erro e o método instrumentado não tratar isso, o New Relic reportará um erro.
Você pode ver isso em um aplicativo de console que chama GetResponse(), conforme mostrado no exemplo. Se GetResponse gerar um erro, o New Relic irá reportá-lo, mesmo que GetResponse() seja chamado dentro de um bloco try/catch. O agente reporta um erro porque a GetResponse() "mini-transação" terminou e o erro ainda não foi tratado na saída da transação.