在调试器中打印异常

时间:2014-03-07 22:16:50

标签: c# debugging exception printing

我的问题在于catch语句。 try执行,但Exception似乎从未被捕获,也不会打印到调试器。结果表明从未处理过Exception并抛出了FindElementException,尽管这正是我想要捕获的。

private void verify(HtmlControl obj, int timeout)
{
    try
    {
        for (int i = 0; i < timeout; i++)
        {
            obj.Wait.ForExists();
            //break;
        }
    }
    catch (Exceptions.FindElementException ex)
    {
        Debug.WriteLine("Could Not Verify Object" + obj + "Exists.  Exception: " + ex);
    }
}

3 个答案:

答案 0 :(得分:1)

非常感谢您的帮助和对该主题的输入,但今天早上我能够通过MSDN博客找到有关该主题的文档。为了将来参考,这是x64版Windows的一个常见问题,不幸的是,没有人能解决这个问题。以下是Microsoft博客中的文字,图片和图片已删除(http://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows-form-or-wpf-application.aspx):

  

为什么调试器无法在x64版本的Windows上捕获/中断未处理的异常?

     

在x64版本的Windows上发生这种情况的原因是一种设计   由Windows操作系统决定; x64版本的Windows   不允许用户模式异常在内核转换后传播   在调用堆栈上。当一个异常被抛出时会发生什么   应用程序,它在调用堆栈上向后移动,直到它   到达异常处理程序或应用程序的“Main()”方法。如果   异常到达应用程序的“Main()”方法而不是   处理完毕后,调试器会识别出异常未处理   打破发生异常的应用程序。如下所示,   Form_Load方法导致内核转换,因此出现异常时   抛出一个Form_Load方法到达内核框架上   callstack,操作系统捕获异常。自从   异常在到达“Main()”方法之前被捕获   调试器的视角异常被捕获 - 调试器无法执行   确定操作系统捕获到异常,   不是用户代码。

     

如何判断这是否是我的问题?

     

这个问题可以通过不同的方式表现出来,具体取决于   异常类型。 Windows窗体和WPF应用程序都有   将捕获的底层框架中的异常处理代码   某些类型的异常(例如NullReferenceException),所以在某些情况下   在你的应用程序将崩溃与未处理的异常的情况下   其他情况下表单将加载并显示,但Form_Load   方法(以及所有后续调用)将无法正确运行   完成。但是“输出”窗口中会显示一条消息   “类型'的第一次机会例外”发生在   ”

     

解决方法

     

不幸的是,调试器在这种情况下可以做的事情不多   操作系统捕获异常(如上所述)。该   Visual Studio中的解决方法是启用“First Chance”例外   Form_Load方法中抛出的异常类型。至   对此:

     

导航到“Debug”菜单,然后选择“Exceptions”检查   “Common Language Runtime Exceptions”行的“Thrown”框。 (注意:   您可以使用“+”符号展开例外,只检查   “Thrown”框用于所需的例外情况“

再次感谢大家的时间和投入!

此致

迈克尔

答案 1 :(得分:0)

我建议打开Visual Studio中的所有异常,以便在异常发生时检查它。您可以转到Debug (menu) > Exceptions...并选中所有复选框来执行此操作。也许FindElementException具有与您期望的不同的命名空间?我怀疑你没有捕捉到你想要的异常类型。

答案 2 :(得分:0)

尝试在其中放置一个泛型catch,并在该catch中放置一个断点。这样,当它捕获时,您可以检查该错误消息并找出它正在抛出的异常。一旦你发现了这一点,你可以改变你的代码以期待那个例外,而不是你所拥有的例外。

步骤1)将您的代码更改为:

private void verify(HtmlControl obj, int timeout)
{
    try
    {
        for (int i = 0; i < timeout; i++)
        {
            obj.Wait.ForExists();
            //break;
        }
    }
    catch (Exceptions.FindElementException ex)
    {
        Debug.WriteLine("Could Not Verify Object" + obj + "Exists.  Exception: " + ex);
    }
    catch {} // PUT THE BREAKPOINT HERE
}

步骤2)运行并找出抛出的异常。评论如果您不知道如何执行此操作,我将解释(假设您使用的是VisualStudio或其他使用断点的编译器)

步骤3)将您的代码更新为:

private void verify(HtmlControl obj, int timeout)
{
    try
    {
        for (int i = 0; i < timeout; i++)
        {
            obj.Wait.ForExists();
            //break;
        }
    }
    catch (INSERTNEWEXCEPTIONTYPEHERE ex)
    {
        Debug.WriteLine("Could Not Verify Object" + obj + "Exists.  Exception: " + ex);
    }
}