标题可能有点困惑,我来解释一下。假设您有这个调用链...
public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index)
现在,如果您调用 DoWork
,它会将调用遍历到 CheckIndex
,将每个更深层次的调用添加到调用堆栈。
现在,如果有人使用错误的 index
值调用 DoWork
,它会一直在 CheckIndex
处抛出异常,目前,这就是调试器中断的地方。然后,您必须返回调用堆栈,才能看到真正的罪魁祸首是有人将错误数据传递给了 DoWork
。
现在回到 VB6 时代,您可以简单地用一个属性装饰 DoWorkHelper
和 CheckIndex
来表示“如果我内部抛出任何异常,请不要突出显示我” ,而是我的来电者,因为他们是那些给我带来坏消息的人!因此,在这种情况下,代码会在 DoWork
内部中断,并突出显示对 DoWorkHeper
的调用。
还有一个设置可以禁用它,因此为了更深入的调试目的,它仍然可以在 CheckIndex
处抛出,这是它实际发生的水平,但有一半的时间,在那里崩溃不会告诉你任何事情,因为如果不返回调用堆栈,您将不知道自己是如何到达那里的。
把它想象成一种修饰代码的方式,当您遇到异常时,自动遍历调用堆栈,直到坏值实际告诉您一些有用的信息。
请注意,这类似于“Break On All Exceptions”,只是您是通过修饰来处理它。另外,您不会设置中断特定类型的异常(例如所有空引用异常等),而是设置特定的方法! (或者更准确地说,调用装饰方法的方法。)
那么 C# 或 .NET 通常有这个吗?
更新
虽然我将答案归功于 Dark Falcon,因为他指导我在那里,但我添加了关于所有属性的含义以及在什么上下文中的更详细解释。在下面查看。
最佳答案
请参阅Just My Code选项。您需要使用 DebuggerHiddenAttribute
或 DebuggerNonUserCodeAttribute
装饰 DoWorkHelper
。
关于c# - 在 C#(或一般的 .NET)中,您可以屏蔽通过属性抛出异常的调用堆栈级别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623269/