查看以下源代码
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或调试器。
答案 0 :(得分:3)
在您显示的方法中没有抛出异常 - 您基本上是将查询返回给调用者,然后该查询失败。
一种选择是强制查询通过调用ToList()
立即执行 。这样,任何异常都会抛出在方法本身中,所以你可以捕获它们:
return searcher.Get()
.Select(mo => mo.Properties["displayName"].Value.ToString())
.ToList();
话虽如此,我强烈建议不要让这样一个空的毯子抓住 - 基本上说,“我不在乎 出错了什么,我希望我的代码继续运行无论如何,我甚至不想记录问题所在。“如果您想要防范ManagementException
,请抓住该特定异常 - 并考虑将其记录下来,以便将来可以尝试避免使用它。