为什么这会抓住所有块实际上并不是全部

代码非常简单—问题是groupPath字符串中有一个无效字符(确切地说是’/’)。

我想要做的事情(至少作为一个停止差距)是跳过DirectoryEntries我无法获得cn – 无论为什么。

但是,当我运行此代码时,catch块不会运行,而是我得到:服务器无法运行。 和未处理的System.Runtime.InteropServices.COMException。

为什么catch阻止不会捕获此exception。

try { using (DirectoryEntry groupBinding = new DirectoryEntry("LDAP://" + groupPath)) { using (DirectorySearcher groupSearch = new DirectorySearcher(groupBinding)) { using (DirectoryEntry groupEntry = groupSearch.FindOne().GetDirectoryEntry()) { results.Add(string.Format("{0}", groupEntry.Properties["cn"].Value.ToString())); } } } } catch { Logger.Error("User has bad roles"); } 

附加观察:代码实际上是在一个自定义的RoleProvider中,好奇的是,如果我在一个简单的winforms应用程序中引用这个提供程序,并使用相同的输入调用这个相同的方法,那么catch块就会完全按照它的设想执行。 我认为这表明有关.NETexception与COMexception的建议答案并不准确。 虽然我无法理解为什么从WebDev服务器执行时此代码不会被捕获

如果未指定要捕获的内容,则默认为.NETexception。 您的exception是在COM中,其中.NET未设置为捕获exception。 处理这个问题的最好方法是捕获COMexception,它看起来像这样:

  try { } catch (System.Runtime.InteropServices.COMException COMex) { } catch (System.Exception ex) { } 

原因有三:

  1. 运行时中有一个错误
  2. 应用程序和/或线程以某些执行代码的一部分结束
  3. 你没有看到整体情况

我个人投票给3,我有无数的调试会话,我想知道为什么有些代码没有处理我的exception,实际上是Visual Studio被配置为停止所有抛出的exception,无论它们是否是抓住与否。

您是否尝试过让程序继续在调试器中运行并查看它是否最终在catch块中?

另外,检查Visual Studio中的设置,转到Debug-> Exceptions对话框,然后检查是否选中了任何Thrown复选框。 如果你有,那可能是你的问题。

当然,如果你在运行时看到这个问题,没有附加调试器,那么我不知道,除了上面的第1点和第2点。

当然,总有第四点:未知。

从try块中抛出的COMException将被catch块捕获并吞没。

rest一下,给自己喝杯咖啡,在“Logger.Error …”一行放一个断点,然后再试一次。

除了COMException之外,还有一些不会被捕获的异步exception,例如:

  • OutOfMemoryExceptionexception
  • StackoverflowException(不,这不是与这个网站相关的笑话:))
  • ThreadAbortException

你确定不是这样吗?

我有类似的问题。 我正在调用一个引发错误的VB6 COM对象。 实际的exception类型是System.Reflection.TargetInvocationException。 innerException设置为COMException。 我最终捕获System.Reflection.TargetInvocationException并检查innerException