代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

为什么这会捕获所有块而不是实际上捕获所有块

  •  7
  • Ralph Shillington  · 技术社区  · 15 年前

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

    我想做的(至少是作为一个止损点)是跳过那些我不能得到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 回复  |  直到 15 年前
        1
  •  13
  •   Noah    15 年前

    如果不指定要捕获的内容,则默认为.NET异常。您的异常在COM中,.NET未设置为捕获异常。处理此问题的最佳方法是捕获COM异常,该异常应类似于以下内容:

        try
        {
    
        }
        catch (System.Runtime.InteropServices.COMException COMex)
        {
    
        }
        catch (System.Exception ex)
        {
    
        }
    
        2
  •  3
  •   Lasse V. Karlsen    15 年前

    有三个原因:

    1. 运行时出现错误
    2. 应用程序和/或线程作为执行的某些代码的一部分结束。
    3. 你看不到整个画面

    就我个人而言,我投了3票,我有无数次的调试会议,我想知道为什么有些代码没有处理我的异常,而实际上是Visual Studio配置为停止所有抛出的异常,不管它们是否被捕获。

    你试过让程序继续在调试程序中运行,然后看看它是否会在catch块中结束吗?

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

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

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

        3
  •  2
  •   to StackOverflow    15 年前

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

    休息一下,喝杯咖啡,在“logger.error…”行上放置一个断点,然后再试一次。

        4
  •  2
  •   Andrei Rînea    15 年前

    除了ComException之外,还有异步异常 不要 被抓到,例如:

    • 内存不足异常
    • StackOverflowException(不,这不是与此网站相关的玩笑:)
    • 三钠硼中毒

    你确定不是这样吗?

        5
  •  1
  •   chris    15 年前

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