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

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

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

  1. ThrowHelper.ThrowAnException ()

而不是在ThrowAnException()中

ax6ht2ek

ax6ht2ek1#

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

  1. class ThrowHelper
  2. {
  3. [DebuggerStepThrough]
  4. public static void Throw()
  5. {
  6. throw new InvalidOperationException();
  7. }
  8. }

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

lg40wkob

lg40wkob2#

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

  1. 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中显示的堆栈跟踪文本中省略
范例:

  1. [System.Diagnostics.StackTraceHidden]
  2. public static class Throw
  3. {
  4. public static T IfNull<T>(
  5. [NotNull] T obj,
  6. string? errorMessage)
  7. {
  8. return obj == null
  9. ? throw new Exception(errorMessage)
  10. : obj;
  11. }
  12. }
展开查看全部

相关问题