如何不打破异常?

时间:2013-04-05 12:04:34

标签: c# visual-studio exception exception-handling

我有这样的事情:

try
{
    instance.SometimesThrowAnUnavoidableException(); // Visual Studio pauses the execution here due to the CustomException and I want to prevent that.
}
catch (CustomException exc)
{
    // Handle an exception and go on.
}

anotherObject.AlsoThrowsCustomException(); // Here I want VS to catch the CustomException.

在代码的另一部分,我有多个情况,其中抛出了 CustomException 。我想强制Visual Studio停止打破 instance.SometimesThrowAnUnavoidableException()行,因为它模糊了我有兴趣打破 CustomException 的其他地方的视图。

我尝试了 DebuggerNonUserCode ,但这是出于不同的目的。

如何禁止Visual Studio仅以某种方法捕获特定异常?

5 个答案:

答案 0 :(得分:2)

您可以使用自定义代码分两步完成此操作。

  1. 禁用CustomException例外的自动中断。
  2. 为您的应用添加AppDomain.FirstChanceException事件的处理程序。在处理程序中,如果实际异常是CustomException,请检查调用堆栈以查看是否确实要中断。
  3. 使用Debugger.Break();导致Visual Studio停止。
  4. 以下是一些示例代码:

    private void ListenForEvents()
    {
        AppDomain.CurrentDomain.FirstChanceException += HandleFirstChanceException;
    }
    
    private void HandleFirstChanceException(object sender, FirstChanceExceptionEventArgs e)
    {
        Exception ex = e.Exception as CustomException;
        if (ex == null)
            return;
    
        // option 1
        if (ex.TargetSite.Name == "SometimesThrowAnUnavoidableException")
            return;
    
        // option 2
        if (ex.StackTrace.Contains("SometimesThrowAnUnavoidableException"))
            return;
    
        // examine ex if you hit this line
        Debugger.Break();
    }
    

答案 1 :(得分:1)

在Visual Studio中,通过取消选中相应的复选框,转到debug-> exception并关闭CustomException的中断,然后在代码中设置断点(可能在catch语句中)你真正想要打破的地方。

答案 2 :(得分:0)

如果希望Visual Studio停止中断类型的所有异常,则必须从“例外”窗口配置行为。

完整说明是here,但要点是转到“调试”菜单并选择例外,然后取消选中您不希望调试器中断的项目。

我认为没有办法避免使用这种技术的特定方法,但也许更好的问题是“为什么这会抛出异常?”

您可以添加一组#IF DEBUG预处理器指令,以避免运行有问题的代码段。

答案 3 :(得分:0)

您可以通过在方法之前放置DebuggerStepThrough Attribute来完全禁用步进。 由于这会禁用整个方法中的步进,因此您可以将try-catch分离为单独的一个用于调试目的。

我没有测试,但是当抛出异常时它甚至不应该破坏该方法。尝试一下; - )

另见this SO thread

答案 4 :(得分:0)

您不能简单地禁止Visual Studio停止在特定的代码位置。您只能在抛出特定类型的异常时阻止它停止,但这会影响发生此类异常的所有位置。

实际上,您可以按照custom solution的建议实施280Z28