1

我有下面的代码,它通过并返回磁盘信息。运行时,我注意到某些 WMI 属性在我的计算机上不可用(即 FirmwareRevision)。

因此,当我运行代码时,VS 会崩溃并显示“未找到”。知道我如何在未找到对象的输出上设置异常捕获以声明“不可用”。

我一直在阅读异常捕获,但到目前为止我的业余方式是明确定义我想要使用的异常......这个程序打算在不同服务器的负载上运行,因此希望它可以智能地找出任何一台服务器的 WMI 对象可能没有。

代码如下,目前它在(最后一行)失败:

"lblFirmware.Text = "固件:" +moDisk["FirmwareRevision"].ToString();"

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using Microsoft.Win32;

namespace diskdrive_info
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Get all the disk drives
            ManagementObjectSearcher mosDisk = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
            // Loop through each object (disk) retrieved by WMI
            foreach (ManagementObject moDisk in mosDisk.Get())
            {
                cmbHdd.Items.Add(moDisk["Model"].ToString());
            }
        }

        private void cmbHdd_SelectedIndexChanged(object sender,EventArgs e)
        {
            ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
            foreach (ManagementObject moDisk in mosDisks.Get())
            {
                lblType.Text = "Type: " + moDisk["MediaType"].ToString();
                lblModel.Text = "Model: " + moDisk["Model"].ToString();
                lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString();
                lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString();
                lblSectors.Text = "Sectors: " + moDisk["SectorsPerTrack"].ToString();
                lblSignature.Text = "Signatures: " +moDisk["Signature"].ToString();
                lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();
            }
        }


    }
}
4

4 回答 4

3

尝试替换:

lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();

和:

lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"] == null ? "Not Available" :  moDisk["FirmwareRevision"].ToString();
于 2012-09-21T14:33:18.897 回答
2

尝试这个

private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            //Get all the disk drives
            ManagementObjectSearcher mosDisk = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
            // Loop through each object (disk) retrieved by WMI
            foreach (ManagementObject moDisk in mosDisk.Get())
            {
                 cmbHdd.Items.Add(moDisk["Model"].ToString());
            }
        }
        catch(Exception exp)
        {

        }
    }

    private void cmbHdd_SelectedIndexChanged(object sender,EventArgs e)
    {
        try
        {
            ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
            foreach (ManagementObject moDisk in mosDisks.Get())
            {
                 lblType.Text = "Type: " + moDisk["MediaType"].ToString();
                 lblModel.Text = "Model: " + moDisk["Model"].ToString();
                 lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString();
                 lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString();
                 lblSectors.Text = "Sectors: " + moDisk["SectorsPerTrack"].ToString();
                 lblSignature.Text = "Signatures: " +moDisk["Signature"].ToString();
                 lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();
            }
        }
        catch(Exception exp)
        {

        }
    }
于 2012-09-21T14:32:01.800 回答
1

这不是您问题的直接答案,但更好的答案是您不应该依赖 try/catch。Catch 语句适用于您无法预见或您的程序无法正常处理的情况。这些都不适用于这里 - 通过在WMI 参考中查找它们,您实际上可以提前知道哪些属性会在哪些操作系统上导致问题。

编写应用程序的更可靠的方法是检查您正在运行的操作系统,并且只尝试检索您知道可用的属性。您仍然应该将所有这些都包装在 try/catch 中,如其他答案所示,以防万一发生其他意外情况,但这种特定情况是您可以预期的并且应该编码而不是抛出和捕获异常。

于 2012-09-21T14:35:47.717 回答
1

此外,为了处理异常,如果您阅读了有关该属性的此类的文档FirmwareRevision

Windows Server 2003、Windows XP、Windows 2000 和 Windows NT 4.0:此属性不可用。

您可以通过检查 Windows 版本来防止这种情况

lblFirmware.Text = "Firmware: " + System.Environment.OSVersion.Version.Major <6 ? "Not Available in this OS" :  moDisk["FirmwareRevision"].ToString();
于 2012-09-22T02:11:50.590 回答