[Serializable]
public class MyAspect: OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
throw new MyCustomException(args.Exception);
}
}
public class MyCustomException : Exception
{
public override string StackTrace
{
get
{
//return new StackTrace(10).ToString(); //Skip frames
return string.Empty; //Return empty string
}
}
}
Realmente tiene que lanzar una NUEVA excepción. El ejemplo de @Ani simplemente volverá a lanzar la excepción ya lanzada con la misma traza de pila (es lo mismo debido a cómo llegaste al aspecto). Lanzar una nueva excepción "cambiará" el seguimiento de la pila pero no lo borrará. Si desea borrarlo, deberá lanzar su propia clase que anule la propiedad de seguimiento de la pila. pasar la excepción anterior a la nueva excepción hará que la excepción anterior sea la excepción interna (si lo desea)
Puede lograr esto con y sin PostSharp. La clave es su clase de excepción personalizada.
Dado el siguiente código
class Program
{
static void Main(string[] args)
{
try
{
Test1();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace + Environment.NewLine);
}
Console.ReadKey();
}
private static void Test1()
{
try
{
Test2();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace + Environment.NewLine);
throw e;
}
}
private static void Test2()
{
try
{
Test3();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace + Environment.NewLine);
throw;
}
}
[MyAspect]
private static void Test3()
{
throw new InvalidOperationException();
}
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
throw args.Exception;
}
}
la salida es
en ConsoleApplication5.MyAspect.OnException (MethodExecutionArgs args) en C: \ T est \ Program.cs: línea 69 en ConsoleApplication5.Program.Test3() en C: \ Test \ Program.cs: línea 59
en ConsoleApplication5.Program.Test2() en C: \ Test \ Program.cs: línea 47
en ConsoleApplication5.MyAspect.OnException (MethodExecutionArgs args) en C: \ T est \ Program.cs: línea 69 en ConsoleApplication5.Program.Test3() en C: \ Test \ Program.cs: Línea 59
en ConsoleApplication5.Program.Test2() en C: \ Test \ Program.cs: línea 52
en ConsoleApplication5.Program.Test1() en C: \ Test \ Program.cs: línea 34
en ConsoleApplication5.Program .Test1() en C: \ Test \ Program.cs: línea 39 en ConsoleApplication5.Program.Main (String [] args) en C: \ Test \ Program.cs: línea 19
Curioso: ¿por qué quieres hacer esto? –
Consulte mi respuesta a continuación, aunque me gustaría desalentar hacer esto. Las excepciones existen por una razón, y eso es para ayudar a la eliminación de errores cuando ocurren. Al eliminar el seguimiento de la pila, está efectivamente ocultando el origen del error, que no encontrará si no está depurando.Si por alguna razón te preocupa la privacidad, puedes intentar ofuscar o encriptar la pila (usando el mismo método descrito en la respuesta), para poder descifrarla luego, por ejemplo, desde un archivo de registro. –
Esto es también lo que necesito, y la razón es porque tengo que pasar un objeto Exception a un servicio web, pero por alguna razón no puedo hacer que el servicio lo acepte. Así que podría simplemente pasar el mensaje y StackTrace, luego volver a crear la excepción del servidor. – ganders