在C#(或一般的.NET)中,您能否屏蔽通过属性引发异常的调用堆栈级别?

在C#(或一般的.NET)中,您能否屏蔽通过属性引发异常的调用堆栈级别?,c#,vb6,exception-handling,callstack,C#,Vb6,Exception Handling,Callstack,标题可能有点混乱,所以我会解释。假设你有这个呼叫链 public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index) 现在,如果调用DoWork,它将遍历调用,直到CheckIndex,将每个更深的调用添加到调用堆栈中 现在,如果有人调用DoWork,而index的值不正确,它会在CheckIndex处抛出异常,目前,调试器就是在这里中断的。然后,您必须返回调用堆栈,以查看真

标题可能有点混乱,所以我会解释。假设你有这个呼叫链

public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index)
现在,如果调用
DoWork
,它将遍历调用,直到
CheckIndex
,将每个更深的调用添加到调用堆栈中

现在,如果有人调用
DoWork
,而
index
的值不正确,它会在
CheckIndex
处抛出异常,目前,调试器就是在这里中断的。然后,您必须返回调用堆栈,以查看真正的违规者是有人将错误数据传递给
DoWork

现在回到VB6时代,您可以简单地用一个属性来修饰
DoWorkHelper
CheckIndex
,该属性表示“如果在我体内抛出任何异常,不要突出显示我,而是突出显示我的调用方,因为他们是传递给我糟糕消息的人!”因此,在本例中,代码将在
DoWork
内部中断,并突出显示对
DoWorkHeper
的调用

还有一个设置可以禁用此功能,因此出于更深入的调试目的,它仍然可以被抛出到
CheckIndex
,即它实际发生的级别,但有一半的时间,在那里发生的故障不会告诉您任何信息,因为您不知道如何在不返回调用堆栈的情况下到达那里

可以把它看作是修饰代码的一种方式,即当遇到异常时,自动遍历调用堆栈,直到错误值实际告诉您有用的东西

注意,这类似于“在所有异常上中断”,除非您通过装饰来处理此问题。另外,您没有设置为在特定类型的异常(例如,所有空引用异常等)上中断,而是设置为在特定方法上中断!(或者更准确地说,是调用修饰方法的方法。)

那么C#或.NET一般都有这样的功能吗


更新
虽然我相信黑暗猎鹰的回答,因为他指示我在那里,我已经添加了一个更详细的解释,所有的属性意味着什么,在什么情况下。请在下面查看。

请查看该选项。您需要使用
DebuggerHiddenAttribute
DebuggerNonUserCodeAttribute

来装饰
DoWorkHelper
,只需添加我发现的更好的解释,这样人们就不必去别处寻找了

有三个与此相关的属性:
DebuggerHidden
DebuggerStepThrough
,以及
DebuggerNonUserCode

规则如下:

仅我的代码
未被选中时:

  • DebuggerNonUserCode

    这基本上被忽略了。断点、单步执行和异常的工作方式都与此属性不存在时相同

  • DebuggerStepThrough

    这将考虑断点,并在出现异常时中断,但您不能手动单步进入标有此属性的块

  • DebuggerHidden

    这不允许您介入这些块,它会忽略断点,任何抛出的异常都在调用方法中处理,而不是在它们实际发生的地方

当选中“仅我的代码”时

  • 这三个属性的行为与您在上面使用的
    DebuggerHidden
    相同
还有另一个属性,
DebuggerStepperBoundary
非常酷。以下是MSDN的摘录:

使用DebuggerStepperBoundary属性从单步执行代码转义到运行代码。例如,在Visual Studio 2005中,使用F10键(或“跳过”命令)单步执行代码时遇到DebuggerStepperBondaryAttribute,其效果与按F5键或使用“开始调试”命令相同


希望这能把事情弄清楚!当然是为了我

[DebuggerStepThrough()]属性有帮助吗?@Kane,有点!看起来这和“黑暗”所说的都是相关的。但是你没有把这个作为答案,所以我不能标记你的答案!:)不过,我还是投票支持你的。请注意,VB6从来没有这样的属性。它所做的是一个全局的(对所有项目)“打破类模块”设置。实际上@Deanna,你是不正确的。有一个属性可以放在代码块上,它的工作原理与我描述的完全相同。这与您所指的是分开的。它不是很有名,但对于我们这些知道它的人来说,它确实有助于调试。一旦我找到我的旧VB6代码(已经好几年了!),我会用它更新答案。我相信DebuggerHidden也会从堆栈跟踪中删除调用。这是有意义的,因为异常现在在调用位置抛出,这意味着从技术上讲它已经从调用中返回,因此它从堆栈中弹出。