我的问题在于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);
}
}
答案 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);
}
}