You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:02:24