代码相当简单---问题是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服务器执行时无法捕获
答案 0 :(得分:13)
如果未指定要捕获的内容,则默认为.NET异常。您的异常是在COM中,其中.NET未设置为捕获异常。解决这个问题的最好方法是捕获COM异常,它应该是这样的:
try
{
}
catch (System.Runtime.InteropServices.COMException COMex)
{
}
catch (System.Exception ex)
{
}
答案 1 :(得分:3)
有三个原因:
我个人投票给3,我有无数的调试会话,我想知道为什么有些代码没有处理我的异常,实际上是Visual Studio被配置为停止所有抛出的异常,无论是什么他们是否被抓住了。
您是否曾尝试让程序继续在调试器中运行,看看它是否最终在catch块中?
另外,检查Visual Studio中的设置,转到Debug-> Exceptions对话框,然后检查是否选中了任何Thrown复选框。如果你有,那可能是你的问题。
当然,如果你在运行时看到这个问题,没有附加调试器,那么我不知道,除了上面的第1点和第2点。
当然,总有第4点:未知。
答案 2 :(得分:2)
catch块会捕获并吞下从try块中抛出的COMException。
休息一下,给自己喝杯咖啡,在“Logger.Error ...”行上设一个断点,然后再试一次。
答案 3 :(得分:2)
沿着COMException,还有异常的异常,不要被抓住,例如:
你确定不是这样吗?
答案 4 :(得分:1)
我有类似的问题。我正在调用一个引发错误的VB6 COM对象。实际的异常类型是System.Reflection.TargetInvocationException。 innerException设置为COMException。我最终捕获了System.Reflection.TargetInvocationException并检查了innerException