gpt4 book ai didi

.net - 检查 WMI ManagementObject 查询是否为 Nothing 而不是使用 Try/Catch?

转载 作者:行者123 更新时间:2023-12-03 18:17:50 25 4
gpt4 key购买 nike

在我的程序中,我使用 WMI 接口(interface)来查询有关程序运行的硬件的大量信息。然后,我将获取该信息并将其放入列表中以帮助稍后显示它,但目前除此之外并没有做太多其他事情。到目前为止,这种方法效果很好,但是有一个主要问题:有时查询是/返回(还不知道是哪一个!)Nothing结果是 NullReferenceException .

现在,显然我可以将它包装在 Try/Catch 中,然后继续我的快乐之路。但是,我想避免这样做,因为我将查询数百位信息,其中数百位可能会导致异常。这只是草率的编程,大大减慢了我的程序!

我的问题是:我要检查什么才能使用 If而不是 Try ?我将把我当前的代码放在下面,然后列出我已经尝试过的解决方案。

    Public Shared Function GetSomeInfo() As List(Of String)
Dim ret As New List(Of String)
Dim sq As New Management.SelectQuery("Win32_Processor")
Dim mos As New Management.ManagementObjectSearcher(sq)
For Each info As Management.ManagementObject In mos.Get()
ret.Add(TryQuery(info, "Name"))
ret.Add(TryQuery(info, "Caption")) 'this query may result in Nothing somewhere...
Next
Return ret
End Function

Private Shared Function TryQuery(ByRef info As
Management.ManagementObject, ByVal strID As String) As String
Try
Return strID & ": " & info(strID).ToString 'exception obviously thrown here...but WHERE?
Catch ex As NullReferenceException
Return String.Empty
Catch ex As Management.ManagementException
Return String.Empty
End Try
End Function

所以,这就是我为了尝试使用这个 Try 所做的尝试。 :
If Not info Is Nothing Then ...仍然导致一些未捕获的异常
If Not info(strID) Is Nothing Then ...仍然有一个异常(exception)的地方
If Not info.Equals(Nothing) Then ...绝望
If Not Info(strID).ToString Is Nothing ... :(

我根本不知道在哪里检查 WMI 查询中抛出的这个异常。任何见解将不胜感激。谢谢!

最佳答案

根据您的描述,虽然对于给定的 WMI 类,属性名称可能被列为现有,但 WMI PropertyData item 不适用于给定的属性名称。蛮力方法应该通过迭代正确的 PropertyDataCollection 来避免生成“未找到”异常。 .

Private Shared Function TryQuery(ByRef info As ManagementObject, ByVal strID As String) As String
Dim ret As String = String.Empty
Dim propDatas As PropertyDataCollection
If strID.StartsWith("__") Then
' system property, ref: https://msdn.microsoft.com/en-us/library/system.management.managementbaseobject.systemproperties(v=vs.110).aspx
propDatas = info.SystemProperties
Else
' object properties: ref: https://msdn.microsoft.com/en-us/library/system.management.managementbaseobject.properties(v=vs.110).aspx
propDatas = info.Properties
End If
For Each data As PropertyData In propDatas
If data.Name.Equals(strID, StringComparison.InvariantCultureIgnoreCase) Then
ret = If(data.Value, String.Empty).ToString
Exit For
End If
Next
Return ret
End Function

此外,大多数 WMI 对象是 Disposable并应相应处理。
Public Shared Function GetSomeInfo() As List(Of String)
Dim ret As New List(Of String)
Dim sq As New Management.SelectQuery("Win32_Processor")
Using mos As New Management.ManagementObjectSearcher(sq)
Using objects As ManagementObjectCollection = mos.Get
For Each info As Management.ManagementObject In objects
Using info
ret.Add(TryQuery(info, "Name"))
ret.Add(TryQuery(info, "Caption")) 'this query may result in Nothing somewhere...
End Using
Next
End Using
End Using
Return ret
End Function

编辑:为了确保此技术有效,您可以检查 source code for the indexer on the ManagementBaseObject .该方法调用:
public Object GetPropertyValue(string propertyName)
{
if (null == propertyName)
throw new ArgumentNullException ("propertyName");

// Check for system properties
if (propertyName.StartsWith ("__", StringComparison.Ordinal))
return SystemProperties[propertyName].Value;
else
return Properties[propertyName].Value;
}

您可以看到这检索到的属性类似于我提供的代码。问题是如果 ProdertyDataCollection 类找不到匹配的属性名称,它将引发“未找到”错误。

关于.net - 检查 WMI ManagementObject 查询是否为 Nothing 而不是使用 Try/Catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50351873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com