在C#(或一般的.NET)中,您是否可以屏蔽通过属性抛出exception的调用堆栈级别?

标题可能有点令人困惑所以我会解释。 说你有这个电话链……

public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index) 

现在,如果您调用DoWork ,它会将调用遍历到CheckIndex ,将每个更深的调用添加到调用堆栈。

现在,如果某人使用错误的index值调用DoWork ,它会在CheckIndex一直抛出exception,而且当前,这就是调试器中断的地方。 然后你必须走回调用堆栈才能看到真正的犯罪者是有人将坏数据传递给DoWork

现在回到VB6时代,你可以简单地用一个属性装饰DoWorkHelperCheckIndex来说’如果我内部抛出任何exception,请不要突出显示我,而是突出我的调用者,因为他们是那些通过我糟糕废话的人!’ 因此,在这种情况下,代码将在DoWork突破, DoWorkHeper突出显示对DoWorkHeper的调用。

还有一个设置可以禁用它,所以为了更深层次的调试目的,它仍然可以抛出CheckIndex ,它实际发生的级别,但有一半的时间,那里的故障告诉你什么都没有,因为你不知道你是怎么到达那里的走回调用堆栈。

可以认为这是一种装饰代码的方法,可以说明当你遇到exception时,自动遍历调用堆栈到坏值实际告诉你有用的地方。

请注意,这类似于“Break On All Exceptions”,除非您通过装饰处理此问题。 另外,您没有设置中断特定类型的exception(例如所有空引用exception等),而是特定方法! (或者更准确地说,是一种称为装饰方法的那种。)

那么C#或.NET一般都有这个吗?


更新

虽然我向Dark Falcon提供了答案,因为他指导我在那里,我已经添加了一个更详细的解释,说明所有属性的含义,以及在什么情况下。 请在下面查看。

请参阅Just My Code选项。 您需要使用DebuggerHiddenAttributeDebuggerNonUserCodeAttribute来装饰DoWorkHelper

只是添加我发现的内容以便更好地解释,这样人们就不必去其他地方寻找……

有三个与此相关的属性: DebuggerHiddenDebuggerStepThroughDebuggerNonUserCode

以下是规则:

如果选中“ Just My Code

  • DebuggerNonUserCode
    这基本上被忽略了。 断点,步入和exception都与此属性不存在相同。

  • DebuggerStepThrough
    这会考虑断点并在出现exception时中断,但您无法手动步入标有此属性的块。

  • DebuggerHidden
    这不允许您介入这些块,它会忽略断点,并且抛出的任何exception都在调用方法中处理,而不是它们实际发生的位置。

选中Just My Code

  • 所有这三个属性的行为与上面使用DebuggerHidden行为相同。

还有另一个属性DebuggerStepperBoundary非常酷。 以下是MSDN的摘录:

使用DebuggerStepperBoundaryAttribute从单步执行代码转移到运行代码。 例如,在Visual Studio 2005中,使用F10键(或Step Over命令)逐步执行代码时遇到DebuggerStepperBoundaryAttribute与按F5键或使用Start Debugging命令具有相同的效果。

希望这可以解决问题! 当然对我有用!