Pergunta

Criei uma exceção personalizada para um problema muito específico que pode dar errado.Recebo dados de outro sistema e levanto a exceção se ele falhar ao tentar analisar esses dados.Na minha exceção personalizada, adicionei um campo chamado "ResponseData" para poder rastrear exatamente o que meu código não conseguiu controlar.

Em exceções personalizadas como esta, esses dados de resposta extras deveriam ir para a "mensagem" da exceção?Se chegar lá, a mensagem pode ser enorme.Eu meio que quero isso porque estou usando o Elmah, e é assim que posso obter esses dados.

Então a questão é:- Como posso fazer com que o Elmah registre informações extras de um campo em uma exceção personalizada ou - os detalhes de exceção extra devem entrar na propriedade "Mensagem"?

Foi útil?

Solução

Você não deveria preencher .Message com informações de depuração, mas sim com um texto conciso e útil.

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

O texto da Mensagem deverá descrever completamente o erro e deverá, quando possível, explicar como corrigi-lo. O valor da propriedade Message está incluído nas informações retornadas por ToString.

A propriedade Message é definida somente ao criar uma exceção.Se nenhuma mensagem tiver sido fornecida ao construtor para a instância atual, o sistema fornecerá uma mensagem padrão formatada usando a cultura do sistema atual.

[..]

Notas para herdeiros:

A propriedade Message é substituída em classes que exigem controle sobre o conteúdo ou formato da mensagem.O código do aplicativo normalmente acessa essa propriedade quando precisa exibir informações sobre uma exceção que foi capturada.

A mensagem de erro deve ser localizada.

Os dados de resposta não se qualificam como uma descrição.

Não estando familiarizado com elmah, não posso lhe dizer como estender o Exception classe enquanto o usa.Elmah implementa sua própria subclasse para Exception?Ou uma interface?Você pode subclassificá-lo sozinho?

Outras dicas

Em exceções personalizadas como este, esses dados de resposta extra devem entrar na exceção "mensagem"?

Não, como Sören já apontou.No entanto, seu tipo de exceção pode substituir ToString e adicione sensatamente as informações dos dados de resposta lá.Esta é uma prática perfeitamente normal seguida por muitos dos tipos de exceção na BCL (Base Class Library), para que você não se encontre nadando contra a maré.Por exemplo, dê uma olhada no System.IO.FileNotFoundException.ToString implementação em SSCLI (rotor):

public override String ToString()
{
    String s = GetType().FullName + ": " + Message;

    if (_fileName != null && _fileName.Length != 0)
        s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);

    if (InnerException != null)
        s = s + " ---> " + InnerException.ToString();

    if (StackTrace != null)
        s += Environment.NewLine + StackTrace;

    try
    {
        if(FusionLog!=null)
        {
            if (s==null)
                s=" ";
            s+=Environment.NewLine;
            s+=Environment.NewLine;
            s+="Fusion log follows: ";
            s+=Environment.NewLine;
            s+=FusionLog;
        }
    }
    catch(SecurityException)
    {

    }
    return s;
}

Como você pode ver, ele anexa o conteúdo de FusionLog propriedade, que representa extra informações em caso de falhas de carga de montagem.

Como posso fazer com que Elmah registre informações extras de um campo em uma exceção personalizada

ELMAH armazena o resultado da chamada ToString em uma exceção como os detalhes do erro, então se você tiver ToString implementado conforme prescrito, as informações seriam registradas sem mais trabalho.O único problema é que os detalhes registrados serão não estruturado texto.

A classe Exception contém um dicionário (chamado Data, acredito) que você pode usar para associar dados personalizados a uma exceção vanilla.

Não entendo completamente a pergunta, mas parece que você está perguntando o que fazer com dados de exceção adicionais. Se essa não for sua pergunta, sinta-se à vontade para ignorar isso.

Acho que uma pergunta importante a ser feita é para que serve exatamente a mensagem de exceção?Não é para saber de onde veio a exceção, o stack trace serve para isso;não é para encapsular uma exceção em outra mais geral, isso deveria ser feito com o campo InnerException;no caso em que sua exceção é gerada apenas a partir de um local específico em seu código, não serve nem para descrever que tipo de erro você teve - é para isso que serve o tipo de exceção.

Geralmente eu uso o campo de mensagem para fornecer dicas simples e legíveis que um programador que não seja eu, vendo esse erro pela primeira vez, pode usar para obter uma compreensão do sistema subjacente.Considero o campo de mensagem apropriado para uma explicação curta (uma frase), uma dica sobre como esse erro é frequentemente levantado ou uma referência para leitura adicional.

Então, pelo que entendi sua pergunta, acho que a melhor forma de armazenar essas 'informações adicionais' que são recebidas de outro sistema é como uma InnerException.Não conheço Elmah, mas se valer a pena, ele verificará InnerExceptions e as armazenará.

Não entendo a pergunta - você está estendendo System.Exception e já adicionou o campo Elmah.É aí que ela pertence – como propriedade pública da própria exceção.

Elmah é um módulo http que registra exceções não tratadas.

Acho que é apenas uma limitação do Elmah, já que ele não armazena campos customizados.Acho que terei que perguntar a esses caras.Eu tenho um campo extra para os dados de resposta, mas Elmah não os armazena.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top