如何编写捕获异常并删除stacktrace的属性?

cm0*_*007 6 exception postsharp stack-trace c#-4.0

我希望为函数(或类)编写一个属性,它将捕获抛出的任何异常并将其StackTrace属性设置为string.Empty.我怎样才能做到这一点?

编辑:

如果我无法在普通的C#中实现这一点,我怎样才能在C#中使用PostSharp执行此操作?

Dus*_*vis 3

[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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您实际上必须抛出一个新的异常。@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

在 C:\Test\Program.cs 中的 ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args):第 69 行 在 C:\Test\Program.cs 中的 ConsoleApplication5.Program.Test3():在
ConsoleApplication5.Program.Test2( 第 59 行) ) 在 C:\Test\Program.cs:第 47 行

在 C:\Test\Program.cs 中的 ConsoleApplication5.MyAspect.OnException(MethodExecutionArgs args):第 69 行 在 C:\Test\Program.cs 中的 ConsoleApplication5.Program.Test3():在
ConsoleApplication5.Program.Test2( 第 59 行) )在 C:\Test\Program.cs:第 52 行,
位于 C:\Test\Program.cs 中的 ConsoleApplication5.Program.Test1():第 34 行

在 C:\Test\Program.cs 中的 ConsoleApplication5.Program.Test1():第 39 行 在 C:\Test\Program.cs 中的 ConsoleApplication5.Program.Main(String[] args):第 19 行