如何用If判断WMI ManagementObject查询是否为Nothing以替代Try/Catch?
用条件检查替代Try/Catch处理WMI查询的空值问题
你遇到的核心问题是:直接通过索引器info(strID)访问WMI属性时,还没来得及判断值是否为空,就可能因为属性不存在或权限限制先抛出异常,这也是你之前的条件判断失效的原因。要安全避开异常,得按步骤逐层检查,而不是直接碰索引器。
改进后的TryQuery函数
Private Shared Function TryQuery(ByRef info As Management.ManagementObject, ByVal strID As String) As String ' 1. 先确保ManagementObject实例本身不为空 If info Is Nothing Then Return String.Empty End If ' 2. 检查目标属性是否存在于当前对象的属性集合中 ' 这一步能直接避免因属性不存在访问索引器抛出的ManagementException If Not info.Properties.Contains(strID) Then Return String.Empty End If ' 3. 获取属性值,排除DBNull和空值的情况 Dim propValue = info.Properties(strID).Value If propValue Is Nothing OrElse propValue Is DBNull.Value Then Return String.Empty End If ' 最后安全转换为字符串返回 Return $"{strID}: {propValue.ToString()}" End Function
为什么你之前的尝试无效?
If Not info Is Nothing Then ...:只检查了info本身,但没处理属性不存在的场景,直接访问info(strID)依然会抛出异常。If Not info(strID) Is Nothing Then ...:问题出在info(strID)这一步——如果属性不存在,索引器会先抛出ManagementException,根本到不了判断是否为Nothing的环节。If Not Info(strID).ToString Is Nothing ...:同样,访问info(strID)时可能先触发异常,而且ToString()本身不会返回Nothing(最多返回空字符串),这个判断逻辑本身就不成立。
极端情况的补充处理
极少数情况下,即使属性存在,也可能因硬件异常或权限限制无法读取值,这时可以加一个极简的Try/Catch作为最后防线(此时异常触发概率极低,不会影响性能):
Try Return $"{strID}: {propValue.ToString()}" Catch Return String.Empty End Try
这样修改后,你就能用条件检查替代大量的异常捕获,既符合编程规范又能显著提升程序运行效率。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

