Pregunta

Tengo una clase de excepción personalizada que contiene algunos campos adicionales. Quiero que estos sean escritos en el método ToString(), pero si pongo en práctica mi propia ToString(), me suelta algunas otras cosas útiles (como escribir el nombre del tipo de excepción, los datos de excepción interna y el seguimiento de la pila).

¿Cuál es la mejor forma / patrón para implementar su propio método ToString() para tales excepciones? Idealmente, debería volver a utilizar el mecanismo existente, pero ser formateado en forma similar a la aplicación ToString() defecto.

ACTUALIZACIÓN: anteponiendo o de agregar mis campos personalizados al texto base.ToString () no es mi humilde opinión ideales, por ejemplo

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 los campos personalizados se escriben al final de la (potencialmente larga) Descripción de excepción. Por otro lado, quiero que el tipo de excepción que es la primera información escrita en la descripción.

ACTUALIZACIÓN 2:. He implementado una solución para esto, busque mi propia respuesta a continuación

¿Fue útil?

Solución 3

OK, esto es lo que ocurrió. He implementado una clase de extensión que replica el mecanismo original para formatear excepciones, pero con un giro: un delegado de encargo de acción que proporciona un plug-in para dar formato a los 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();
    }
}

Ahora puede utilizar este método en su propia ToString () implementaciones sin duplicar el código de formato:

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

Otros consejos

Esto es una exageración. Su excepción solo debe reemplazar la propiedad del mensaje.

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

El método ToString predeterminado para la clase de excepción es básicamente "ClassName: Message --> InnerException.ToString() StackTrace". Así anulando el mensaje pone el texto del mensaje exactamente donde tiene que estar.

Se podría añadir manualmente los datos por defecto para la cadena devuelta por ToString, al observar las propiedades de excepción. Por ejemplo, lo siguiente será simular los datos devueltos por defecto por el método ToString de una excepción (asumiendo que no hay excepciones interiores):

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

O, simplemente puede añadir (o anteponer) los datos devueltos por base.ToString a la información que desea añadir.

Puede reemplazar el método ToString () para incluir su propia información personalizada, y todavía llamar a la ToString Excepción base por defecto () así:

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

Si está principalmente mirarlos en el depurador, a continuación, puede utilizar el atributo [DebuggerDisplay] para especificar su formato y no tocar el método ToString existente.

De lo contrario, simplemente sobrecargar ToString y asegúrese de llamar a la versión de la clase base base.ToString()

Dentro de la llamada base.ToString anulación () y modificar la cadena resultante a sus necesidades ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top