空捕获但异常仍然被抛出

时间:2017-01-22 17:43:56

标签: c# exception

查看以下源代码

    private IEnumerable<string> GetAntivirusSoftwareFromNamespace(string @namespace)
    {
        try
        {
            var wmipathstr = string.Format(@"\\{0}{1}", Environment.MachineName, @namespace);
            var searcher = new ManagementObjectSearcher(wmipathstr, "SELECT * FROM AntivirusProduct");
            return from ManagementObject managementObject in searcher.Get()
                select managementObject.Properties["displayName"].Value.ToString();
        }
        catch
        {
            // ignored
        }
        return Enumerable.Empty<string>();
    }

我用下面的代码来称呼它

        antivirusSoftware.AddRange(GetAntivirusSoftwareFromNamespace(@"\root\SecurityCenter"));
        antivirusSoftware.AddRange(GetAntivirusSoftwareFromNamespace(@"\root\SecurityCenter2"));

正如您所看到的,expcetion被忽略 - 这在我的计算机上运行良好。 但是,如果我在登台服务器(即Windows Server 2016 Standard)上运行它,则仍会抛出异常。这是堆栈跟踪

  

Unbehandelte Ausnahme:System.Management.ManagementException:   UngültigeKlassebei   System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus   errorCode)bei   System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()   bei System.Linq.Enumerable.d__94`1.MoveNext()bei   System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
  bei System.Collections.Generic.List`1.InsertRange(Int32 index,   IEnumerable`1集合)bei   protocol.client.Service.Modules.Information.InformationService.GetAntivirusSoftware()   在   C:\ TeamCity的\ buildAgent \工作\ a41c7d46cc4907de的\ src \客户端\服务\模块\信息\ InformationService.cs:Zeile   70。

知道这可能是什么原因或如何解决?我没有在登台服务器上安装visual studio或调试器。

1 个答案:

答案 0 :(得分:3)

在您显示的方法中没有抛出异常 - 您基本上是将查询返回给调用者,然后该查询失败。

一种选择是强制查询通过调用ToList()立即执行 。这样,任何异常都会抛出在方法本身中,所以你可以捕获它们:

return searcher.Get()
               .Select(mo => mo.Properties["displayName"].Value.ToString())
               .ToList();

话虽如此,我强烈建议不要让这样一个空的毯子抓住 - 基本上说,“我不在乎 出错了什么,我希望我的代码继续运行无论如何,我甚至不想记录问题所在。“如果您想要防范ManagementException,请抓住该特定异常 - 并考虑将其记录下来,以便将来可以尝试避免使用它。