C # equivalente a Exception.printStackTrace () de Java?

83

¿Existe un método equivalente en C # al de Java Exception.printStackTrace()o tengo que escribir algo yo mismo, trabajando en las InnerExceptions?

Epaga
fuente

Respuestas:

120

Prueba esto:

Console.WriteLine(ex.ToString());

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

La implementación predeterminada de ToString obtiene el nombre de la clase que lanzó la excepción actual, el mensaje, 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 nulo, su valor no se incluye en la cadena devuelta.

Tenga en cuenta que en el código anterior ToStringno se requiere la llamada a, ya que hay una sobrecarga que toma System.Objecty llama ToStringdirectamente.

Dibujó Noakes
fuente
1
Lo probé en .Net Core 2.1 en Linux y parece que ya no es cierto
selalerer
104

Me gustaría agregar: Si desea imprimir la pila fuera de una excepción, puede usar:

Console.WriteLine(System.Environment.StackTrace);
Ryan Cook
fuente
10

Como dice Drew, simplemente convertir la excepción en una cadena hace esto. Por ejemplo, este programa:

using System;

class Test
{
    static void Main()
    {
        try
        {
            ThrowException();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    static void ThrowException()
    {

        try
        {
            ThrowException2();
        }
        catch (Exception e)
        {
            throw new Exception("Outer", e);
        }
    }

    static void ThrowException2()
    {
        throw new Exception("Inner");
    }
}

Produce esta salida:

System.Exception: Outer ---> System.Exception: Inner
   at Test.ThrowException2()
   at Test.ThrowException()
   --- End of inner exception stack trace ---
   at Test.ThrowException()
   at Test.Main()
Jon Skeet
fuente
1
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}
Steve Brouillard
fuente
1
Eso no incluirá el mensaje ni los detalles de la excepción interna.
Drew Noakes
0

¿No existe una API de registro de C # que pueda tomar una excepción como argumento y manejar todo por usted, como lo hace Log4J de Java?

Es decir, use Log4NET.

JeeBee
fuente
Creo que señala por qué Microsoft podría no haber proporcionado tanta funcionalidad en C # como lo hizo Java (siendo el lenguaje más antiguo desarrollado en tiempos más simples). Es decir, hay una forma mejor que se recomienda.
JeeBee
0

Como la respuesta de @ ryan-cook no funcionó para mí, si desea imprimir el seguimiento de la pila sin tener una excepción, puede usar:

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
Console.WriteLine(stackTrace)

Desafortunadamente, esto no se puede hacer en una PCL o en una biblioteca estándar .NET

gianlucaparadise
fuente
-1

También mire Log4Net ... es un puerto de Log4J a .NET.

nbevans
fuente