2011-09-26 10 views
20

Estoy mirando a través de un código y encontré e.ToString() y me preguntaba si hay alguna diferencia con el uso del método ToString() en lugar de .Message?¿Cuál es la diferencia entre Exception's .ToString() y .Message?

Al leer a continuación, parece que devuelve más información.

From Microsoft's Docs

ToString el apoyo de .NET Compact Framework. Anulado. Crea y devuelve una representación de cadena de la excepción actual.

Mensaje Compatible con .NET Compact Framework. Obtiene un mensaje que describe la excepción actual.

+7

Creo que responde a su propia pregunta es –

+0

Excepción un objeto, usando ToString en él, convierte el objeto en una Cadena (que es un objeto) por lo que probablemente simplemente sea igual a Namespace.Exception. –

+3

@Ramhound: 'Exception' anula' ToString'. – SLaks

Respuesta

18

Si lo que busca es obtener tanta información como sea posible de una sola vez, llame ToString():

La implementación predeterminada de ToString obtiene el nombre de la clase que lanzó la excepción actual, el mensaje(mi énfasis), el resultado de llamar a ToString en la excepción interna y el resultado de llamar a Environment.StackTrace. Si alguno de estos miembros es Nothing, su valor no se incluye en la cadena devuelta.

Es conveniente que usted no tiene que anexar todos los elementos individuales junto a ti mismo, comprobando que ninguno de ellos es nula, etc. Todo está construido en ...

Exception.ToString Method

Usted también puede verificar el código fuente actual al reference.microsoft.com.

0

El método ToString devuelve la propiedad Message junto con información sobre dónde se produjo el error.

La propiedad Message está destinada a una breve descripción del error, y solo contiene lo que la persona que implementa la Excepción puso allí. El resporte de ToString contiene información adicional que siempre está incluida.

Si está ejecutando en modo de depuración, el informe de error contiene información más detallada, p. números de línea en la pila de llamadas.

5

ToString() devuelve el Message junto con el StackTrace.
ToString() también incluirá recursivamente InnerException s.

ToString() devuelve una cadena mucho más larga que es mucho más útil que Message al rastrear errores.

2

siempre se puede simplemente probarlo y ver:

try 
{ 
    throw new Exception("This is a test."); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
    Console.WriteLine(ex.Message); 
} 

(se dará cuenta de que son correctos, .ToString es más informativo, que incluye entre otras cosas el seguimiento de pila

+4

Debería usar este bloque catch en su lugar: 'catch (Exception ex) { Console.WriteLine (" #### RESULTADO DE TOSTRING ###### "); Console.WriteLine (ex); Console.WriteLine(); Console.WriteLine ("#### RESULTADO DEL MENSAJE ######") ;; Console.WriteLine (ejemplo.Mensaje); } '. Esto ayudará al OP a distinguir la salida de ambos –

0

El e..ToString() le dará un mensaje detallado como PrintTrace, creo que Display es el nombre de la excepción y la línea donde se emitió la excepción, donde e.Message Output es solo un mensaje legible sin especificación.

Puede comprobar constructor base Excepción

12

Intente utilizar .NET Reflector o similar a ver lo que el método ToString en System.Exception está haciendo:

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
public override string ToString() 
{ 
    return this.ToString(true); 
} 

private string ToString(bool needFileLineInfo) 
{ 
    string className; 
    string message = this.Message; 
    if ((message == null) || (message.Length <= 0)) 
    { 
     className = this.GetClassName(); 
    } 
    else 
    { 
     className = this.GetClassName() + ": " + message; 
    } 
    if (this._innerException != null) 
    { 
     className = className + " ---> " + this._innerException.ToString(needFileLineInfo) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack"); 
    } 
    string stackTrace = this.GetStackTrace(needFileLineInfo); 
    if (stackTrace != null) 
    { 
     className = className + Environment.NewLine + stackTrace; 
    } 
    return className; 
} 
Cuestiones relacionadas