[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
}
}
}
Вы действительно должны бросить НОВОЕ исключение. Пример @ Ani просто перебросит исключение, уже выданное с той же трассировкой стека (то же самое из-за того, как вы попали в аспект) Создание нового исключения «изменит» трассировку стека, но не удалит ее. Если вы хотите стереть его, вам нужно создать собственный класс, который переопределяет свойство трассировки стека. передача старого исключения новому исключению сделает старое исключение внутренним исключением (если вы этого хотите)
Вы можете сделать это с и без PostSharp. Ключ - ваш пользовательский класс исключений.
Учитывая следующий код
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;
}
}
вывод
в ConsoleApplication5.MyAspect.OnException (MethodExecutionArgs
args) в C: \ T est \ Program.cs: строка 69 в
ConsoleApplication5.Program.Test3 () в C: \ Test \ Program.cs: строка 59
в ConsoleApplication5.Program.Test2 () в C: \ Test \ Program.cs: строка 47
в ConsoleApplication5.MyAspect.OnException (MethodExecutionArgs
args) в C: \ T est \ Program.cs: строка 69 в
ConsoleApplication5.Program.Test3 () в C: \ Test \ Program.cs: строка 59
в ConsoleApplication5.Program.Test2 () в C: \ Test \ Program.cs: строка 52
в ConsoleApplication5.Program.Test1 () в C: \ Test \ Program.cs: строка 34
в ConsoleApplication5.Program.Test1 () в C: \ Test \ Program.cs: строка
39 в ConsoleApplication5.Program.Main (String [] args) в
C: \ Test \ Program.cs: строка 19