C# 捕获为空,但仍引发异常
看看下面的源代码C# 捕获为空,但仍引发异常,c#,exception,C#,Exception,看看下面的源代码 private IEnumerable<string> GetAntivirusSoftwareFromNamespace(string @namespace) { try { var wmipathstr = string.Format(@"\\{0}{1}", Environment.MachineName, @namespace); var searcher = n
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>();
}
正如你所看到的,这个表达式被忽略了——这在我的电脑上运行得很好。
但是,如果我在我的暂存服务器(Windows server 2016标准)上运行它,仍然会引发异常。这是堆栈跟踪
Unbehandlet Ausnahme:System.Management.ManagementException:
乌尔蒂奇·克拉斯·贝伊
System.Management.ManagementException.ThrowWithExtendedInfo(管理状态
错误代码)bei
System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
bei System.Linq.Enumerable.d_u94`1.MoveNext()bei
System.Linq.Enumerable.whereselectEnumerableInterator`2.MoveNext()bei System.Collections.Generic.List`1.InsertRange(Int32索引, IEnumerable`1集合)bei protocol.client.Service.Modules.Information.InformationService.GetAntivirusSoftware() 在里面 C:\TeamCity\buildAgent\work\a41c7d46cc4907de\src\client\Service\Modules\Information\InformationService.cs:Zeile 七十
你知道这件事的原因是什么,或者怎么解决吗?我没有在登台服务器上安装visual studio或调试器。在您显示的方法中不会引发异常-您基本上是在向调用者返回查询,然后该查询将失败 一个选项是通过调用
ToList()
强制立即执行查询。这样,任何异常都会在方法本身中抛出,因此您可以捕获它们:
return searcher.Get()
.Select(mo => mo.Properties["displayName"].Value.ToString())
.ToList();
话虽如此,我还是强烈建议不要使用这样一个空的、笼统的catch块,它的基本意思是:“我不在乎出了什么问题,我希望我的代码能够一直运行,我甚至不想记录问题所在。”如果您想防范
管理异常
,请注意特定的异常,并考虑对它进行日志记录,以便以后可以避免它。 < p>异常没有被抛出在所显示的方法中——基本上是将查询返回给调用方,然后查询失败。
一个选项是通过调用ToList()
强制立即执行查询。这样,任何异常都会在方法本身中抛出,因此您可以捕获它们:
return searcher.Get()
.Select(mo => mo.Properties["displayName"].Value.ToString())
.ToList();
话虽如此,我还是强烈建议不要使用这样一个空的、笼统的catch块,它的基本意思是:“我不在乎出了什么问题,我希望我的代码能够一直运行,我甚至不想记录问题所在。”如果您想防范
管理异常
,请注意那个特定的异常,并考虑对它进行日志记录,以便以后可以避免。啊,该死,你完全正确。LINQ查询将在AddRange方法中返回执行。。。我怎么会那么愚蠢-显然事情是最糟糕的。。非常感谢!是的,我现在要抓住管理例外,谢谢你的建议!啊,该死的,你完全正确。LINQ查询将在AddRange方法中返回执行。。。我怎么会那么愚蠢-显然事情是最糟糕的。。非常感谢!是的,我现在要抓住管理例外,谢谢你的建议!