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

时间:2009-05-22 16:22:10

标签: c# .net directoryservices roleprovider

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

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

然而,当我运行此代码时,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服务器执行时无法捕获

5 个答案:

答案 0 :(得分:13)

如果未指定要捕获的内容,则默认为.NET异常。您的异常是在COM中,其中.NET未设置为捕获异常。解决这个问题的最好方法是捕获COM异常,它应该是这样的:

    try
    {

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

    }
    catch (System.Exception ex)
    {

    }

答案 1 :(得分:3)

有三个原因:

  1. 运行时中存在错误
  2. 应用程序和/或线程以某些执行代码
  3. 的一部分结束
  4. 你没看到全貌
  5. 我个人投票给3,我有无数的调试会话,我想知道为什么有些代码没有处理我的异常,实际上是Visual Studio被配置为停止所有抛出的异常,无论是什么他们是否被抓住了。

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

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

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

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

答案 2 :(得分:2)

catch块会捕获并吞下从try块中抛出的COMException。

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

答案 3 :(得分:2)

沿着COMException,还有异常的异常,不要被抓住,例如:

  • OutOfMemoryException异常
  • StackoverflowException(不,这不是与此网站相关的笑话:))
  • ThreadAbortException

你确定不是这样吗?

答案 4 :(得分:1)

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

相关问题