gpt4 book ai didi

exception - 如何编写捕获异常并删除堆栈跟踪的属性?

转载 作者:行者123 更新时间:2023-12-03 07:59:34 25 4
gpt4 key购买 nike

我希望为函数(或类)编写一个属性,该属性将捕获抛出的任何异常并设置其 StackTrace属性(property)到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
}
}
}

你实际上必须抛出一个新的异常。 @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;
}
}

输出是

at ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args) in C:\T est\Program.cs:line 69 at ConsoleApplication5.Program.Test3() in C:\Test\Program.cs:line 59
at ConsoleApplication5.Program.Test2() in C:\Test\Program.cs:line 47

at ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args) in C:\T est\Program.cs:line 69 at ConsoleApplication5.Program.Test3() in C:\Test\Program.cs:line 59
at ConsoleApplication5.Program.Test2() in C:\Test\Program.cs:line 52
at ConsoleApplication5.Program.Test1() in C:\Test\Program.cs:line 34

at ConsoleApplication5.Program.Test1() in C:\Test\Program.cs:line 39 at ConsoleApplication5.Program.Main(String[] args) in C:\Test\Program.cs:line 19

关于exception - 如何编写捕获异常并删除堆栈跟踪的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com