我希望为一个函数(或类)编写一个属性,可以捕获抛出的任何异常,并将其StackTrace
属性设置为string.Empty
。我该如何做到这一点?
编辑:
如果我在普通的C#中无法实现这一点,那么我该如何在使用PostSharp的C#中实现呢?
我希望为一个函数(或类)编写一个属性,可以捕获抛出的任何异常,并将其StackTrace
属性设置为string.Empty
。我该如何做到这一点?
编辑:
如果我在普通的C#中无法实现这一点,那么我该如何在使用PostSharp的C#中实现呢?
[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
}
}
}
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;
}
}
输出结果为:
在 C:\Test\Program.cs 的第 69 行,ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args)
在 C:\Test\Program.cs 的第 59 行,ConsoleApplication5.Program.Test3()
在 C:\Test\Program.cs 的第 47 行,ConsoleApplication5.Program.Test2()在 C:\Test\Program.cs 的第 69 行,ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args)
在 C:\Test\Program.cs 的第 59 行,ConsoleApplication5.Program.Test3()
在 C:\Test\Program.cs 的第 52 行,ConsoleApplication5.Program.Test2()
在 C:\Test\Program.cs 的第 34 行,ConsoleApplication5.Program.Test1()在 C:\Test\Program.cs 的第 39 行,ConsoleApplication5.Program.Test1()
在 C:\Test\Program.cs 的第 19 行,ConsoleApplication5.Program.Main(String[] args)
System.Exception
的堆栈跟踪? - cm007异常的原始堆栈跟踪信息存储在Exception
类的一个字段中。如果您不想创建自己的异常类型,但又想删除这些信息,可以使用反射来移除它,如下所示:
[Serializable]
public sealed class NoStackTraceException : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
RemoveStackTrace(args.Exception);
}
private void RemoveStackTrace(Exception exception)
{
FieldInfo stackTraceField = typeof(Exception).GetField("_stackTrace",
BindingFlags.NonPublic | BindingFlags.Instance);
if (stackTraceField != null)
{
// sets the value of _stackTrace to null
stackTraceField.SetValue(exception, null);
}
}
}
您的异常将不再包含堆栈跟踪。
编辑 当然,您也可以在catch
块中实现同样的功能,而不需要使用PostSharp。