2012-09-21 25 views
1

我有下面的代碼,它通過並返回磁盤信息。運行時,我注意到一些WMI屬性在我的電腦上不可用(即FirmwareRevision)。我該如何放入例外catch

所以,當我運行代碼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(); 
      } 
     } 


    } 
} 
+0

所以,你不想試試'{Somecode();}趕上{}'? – user1655481

回答

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) 
     { 

     } 
    } 
+0

輝煌!非常感謝! – lara400

3

去替代:

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

有:

lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"] == null ? "Not Available" : moDisk["FirmwareRevision"].ToString(); 
+0

謝謝你,但它仍然停止。我嘗試了「玉」提供的解決方案,似乎工作。再次感謝! – lara400

+0

這實際上不起作用。問題可能不是NullReferenceException,它是一個KeyNotFoundException。 –

1

這不是對你的問題的直接回答,但更好的答案是你不應該依賴try/catch。 Catch語句適用於您不能預見的情況,或者您的程序無法正常處理的情況。這些都不適用於此 - 您可以事先知道哪些屬性會在WMI Reference中查找哪些操作系統會導致問題。

更強大的編寫應用程序的方法是檢查您正在運行的操作系統,並只嘗試檢索您知道可用的屬性。您應該將其全部內容都包含在其他答案中顯示的try/catch中,以防萬一發生其他意外情況,但這種特定情況是您可以期望的,應該編碼而不是拋出和捕獲異常。

1

另外處理異常,如果你看過documentation關於這個類的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();