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方法中返回执行。。。我怎么会那么愚蠢-显然事情是最糟糕的。。非常感谢!是的,我现在要抓住管理例外,谢谢你的建议!