Pergunta

Eu tenho uma classe de exceção personalizada que contém alguns campos adicionais. Eu quero que estes sejam escritos no ToString() método, mas se eu implementar meu próprio ToString(), Eu perco algumas outras coisas úteis (como escrever o nome do tipo de exceção, os dados de exceção interna e o rastreamento da pilha).

Qual é a melhor maneira/padrão para implementar o seu próprio ToString() Método para tais exceções? Idealmente, deve reutilizar o mecanismo existente, mas ser formatado de maneira semelhante ao padrão ToString() implementação.

ATUALIZAÇÃO: Preparar ou anexar meus campos personalizados ao texto base.ToString () não é ideal IMHO, por exemplo

PimTool.Utilities.OERestServiceUnavailableException: test ---> System.InvalidOperationException: inner message
   --- End of inner exception stack trace ---
   at PimTool.Tests.Services.OE.OERestClientTests.ExceptionsLogging() in D:\svn\NewPimTool\PimTool.Tests\Services\OE\OERestClientTests.cs:line 178, 
   StatusCode=0, message='test', requestId='535345'

significa que os campos personalizados são gravados no final da descrição da exceção (potencialmente longa). Por outro lado, quero que o tipo de exceção seja a primeira informação escrita na descrição.

ATUALIZAÇÃO 2: Eu implementei uma solução para isso, procure minha própria resposta abaixo.

Foi útil?

Solução 3

Ok, foi isso que eu inventei. Eu implementei uma classe de extensão que replica o mecanismo original para a formatação de exceções, mas com uma reviravolta: um delegado de ação personalizado que fornece um plug-in para a formatação de campos personalizados:

public static class ExceptionFormatterExtensions
{
    public static string ExceptionToString (
        this Exception ex, 
        Action<StringBuilder> customFieldsFormatterAction)
    {
        StringBuilder description = new StringBuilder();
        description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);

        if (customFieldsFormatterAction != null)
            customFieldsFormatterAction(description);

        if (ex.InnerException != null)
        {
            description.AppendFormat(" ---> {0}", ex.InnerException);
            description.AppendFormat(
                "{0}   --- End of inner exception stack trace ---{0}",
                Environment.NewLine);
        }

        description.Append(ex.StackTrace);

        return description.ToString();
    }
}

Agora você pode usar este método em suas próprias implementações ToString () sem duplicar o código de formatação:

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }

Outras dicas

Isso tudo é exagerado. Sua exceção deve apenas substituir a propriedade da mensagem.

public override String Message {
    get {  
        return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
    }
}

O método de tostragem padrão para a classe de exceção é basicamente "ClassName: Message --> InnerException.ToString() StackTrace". Então, substituir a mensagem coloca o texto da sua mensagem exatamente onde deveria estar.

Você pode adicionar manualmente os dados padrão à sequência retornada por ToString, olhando para as propriedades de exceção. Por exemplo, o seguinte simulará os dados retornados por padrão por uma exceção ToString Método (assumindo que não há exceções internas):

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

Ou, você pode simplesmente anexar (ou prender) os dados retornados por base.ToString para as informações que você deseja adicionar.

Você pode substituir o método ToString () para incluir suas próprias informações personalizadas e ainda ligar para a exceção base padrão ToString () como esta:

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}

Se você está olhando principalmente para eles no depurador, pode usar o [DebuggerDisplay] atribuir para especificar sua formatação e não tocar no existente ToString método.

Caso contrário, apenas sobrecarregue ToString e não deixe de ligar para a versão da classe base base.ToString()

Dentro da substituição de chamadas Base.ToString () e modifique a string resultante para suas necessidades ...

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