.net 如何阻止自定义ThrowHelper出现在StackTrace中?

dzhpxtsq  于 2023-10-21  发布在  .NET
关注(0)|答案(3)|浏览(91)

在.net基类库中可以找到ThrowHelper模式。从本质上讲,它减少了每个方法的字节代码量。
无论如何,我想知道是否有一个属性指令来阻止throw Helper中引起的错误停止在helper中。我希望调试器在调用行停止。

ThrowHelper.ThrowAnException ()

而不是在ThrowAnException()中

ax6ht2ek

ax6ht2ek1#

你也可以用attribute标记你的投掷方法:

class ThrowHelper
{
    [DebuggerStepThrough]
    public static void Throw()
    {
        throw new InvalidOperationException();
    }
}

则调试器将不会输入此方法。

lg40wkob

lg40wkob2#

你可以让helper方法实际上不抛出异常,只是创建它。堆栈跟踪将指向真实的方法中的throw语句,而不是ThrowHelper中的任何内容。

throw ThrowHelper.CreateAnException();
5uzkadbs

5uzkadbs3#

您可以通过使用[System.Diagnostics.StackTraceHidden]属性装饰方法或类来隐藏或排除堆栈跟踪中包含的方法。
StackTraceHidden属性在.NET 6中引入。
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.stacktracehiddenattribute
StackTraceHidden属性化的类型和方法将从StackTrace.ToString()和Exception.StackTrace中显示的堆栈跟踪文本中省略
范例:

[System.Diagnostics.StackTraceHidden]
public static class Throw
{
    public static T IfNull<T>(
        [NotNull] T obj,
        string? errorMessage)
    {
        return obj == null
            ? throw new Exception(errorMessage)
            : obj;
    }
}

相关问题