我有下面的代码,它通过并返回磁盘信息。在运行时,我注意到我的计算机(即FirmwareRevision)上没有一些WMI属性。
所以,当我运行代码VS时,它会崩溃,说明“找不到”。是否知道如何将异常捕获到对象输出的状态,而不被发现为"Not Available“。
我一直在阅读异常捕获,但到目前为止,我的业余方法是明确定义我想要的异常,use...this程序打算在不同的服务器负载上运行,因此希望它能够智能地计算出任何一台服务器可能没有的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();
}
}
}
}发布于 2012-09-21 14:32:01
尝尝这个
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-21 14:33:18
试着替换:
lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();通过以下方式:
lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"] == null ? "Not Available" : moDisk["FirmwareRevision"].ToString();发布于 2012-09-21 14:35:47
这不是对你问题的直接回答,但更好的答案是,你不应该依赖于尝试/抓住。Catch语句适用于您无法忽略或您的程序无法优雅处理的情况。这两种属性都不适用于此--通过在WMI参考中查找哪些属性,您实际上可以提前知道哪些属性会在哪个操作系统上引起问题。
编写应用程序的更健壮的方法是检查正在运行的操作系统,并且只尝试检索已知可用的属性。您仍然应该像其他答案中所示的那样,将其包装在一个try/catch中,以防发生其他意想不到的事情,但这种特殊情况是您可以预料到的,应该编写代码,而不是抛出和捕获异常。
https://stackoverflow.com/questions/12532551
复制相似问题