7

代码相当简单 --- 问题是 groupPath 字符串中有一个无效字符(准确地说是“/”)。

我正在尝试做的(至少作为权宜之计)是跳过我无法获得 cn 的 DirectoryEntries --- 不管为什么。

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

为什么 catch 块不会捕获此异常。

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 块完全按照它的假设做。我认为这表明关于 .NET 异常与 COM 异常的建议答案并不准确。尽管我不明白为什么从 WebDev 服务器执行此代码时无法捕获

4

5 回答 5

13

当您不指定要捕获的内容时,它默认为 .NET 异常。您的异常在 COM 中,其中 .NET 未设置为捕获异常。处理这个问题的最好方法是捕获 COM 异常,它应该看起来像这样:

    try
    {

    }
    catch (System.Runtime.InteropServices.COMException COMex)
    {

    }
    catch (System.Exception ex)
    {

    }
于 2009-05-22T16:53:45.033 回答
3

原因有以下三个:

  1. 运行时存在错误
  2. 应用程序和/或线程作为执行的某些代码的一部分而结束
  3. 你没有看到全貌

就我个人而言,我投了 3 票,并且我进行过无数次调试会话,我想知道为什么某些代码没有处理我的异常,而实际上是 Visual Studio 被配置为停止所有抛出的异常,无论它们是否是抓住与否。

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

此外,检查 Visual Studio 中的设置,转到“调试”->“异常”对话框,并检查是否选中了任何“抛出”复选框。如果你有,那可能是你的问题。

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

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

于 2009-05-22T19:53:39.680 回答
2

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

休息一下,给自己喝杯咖啡,在“Logger.Error...”行设置一个断点,然后再试一次。

于 2009-05-22T19:48:48.490 回答
2

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

  • 内存不足异常
  • StackoverflowException(不,这不是与本网站相关的笑话 :))
  • 线程中止异常

你确定不是这样吗?

于 2009-05-22T20:14:59.013 回答
1

I had a similar problem. I was invoking a VB6 COM object that raised an error. The actual exception type turned out to be System.Reflection.TargetInvocationException. The innerException was set to the COMException. I ended up catching the System.Reflection.TargetInvocationException and checking the innerException

于 2009-07-27T21:36:35.800 回答