2012-09-25 96 views
0

做下面的嘗試捕捉有什麼更好的方法?目前,我在每個WMI字段都有自己的try catch語句。嘗試捕捉問題

我不想讓整個班級進入一個大規模的嘗試捕捉,因爲我有問題與字段不顯示任何東西回來(嘗試這一點,並不適合我所做的)。

我有大約25個其他WMI字段需要輸入,並且想知道是否有更簡單的方法來執行此操作?

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()) 
{ 
    try 
    { 
     lblSystemName.Text = "SystemName: " + moDisk["systemname"]; 
    } 
    catch (Exception) 
    { 

     lblSystemName.Text = "SystemName: WMI Error"; ; 
    } 
    try 
    { 
     lblType.Text = "Type: " + moDisk["MediaType"].ToString(); 
    } 
    catch (Exception) 
    { 

     lblType.Text = "Type: WMI Error"; 
    } 
} 
+3

爲什麼你會在那裏得到例外?我會努力的原因,而不是症狀。 –

+0

僅當moDisk [「MediaType」]爲空時纔會生成異常。但是這可以通過使用if語句來阻止。 – Narendra

+0

問題是,如果我有一個說「可用性」的WMI字段,那麼運行這個服務器的其中一個服務器就沒有任何理由(這很好)的「可用性」。然而,「Availability」之後的下一個WMI字段可能是「FirmwareVersion」(它確實存在)。然而,由於「Availability」返回了一個異常(wmi類不存在),我注意到「FirmwareVersion」然後什麼都不顯示(即使它應該)。我被告知,這是因爲我有一個大規模的嘗試捕捉方法,得到一個例外,並直接趕上,而不是繼續。 – lara400

回答

2

你可以使用一個輔助方法:

private static string GetMOValue(ManagementObject mo, string name) 
{ 
    try 
    { 
     object result = mo[name]; 
     return result == null ? "" : result.ToString(); 
    } 
    catch(Exception) 
    { 
     return "WMI Error"; 
    } 
} 

... 
lblSystemName.Text = GetMOValue(moDisk, "systemname"); 
lblType.Text = GetMOValue(moDisk, "MediaType"); 

注意你應該趕上一個更具體的異常(不知道有什麼異常可以通過索引的ManagementObject拋出)。

+0

謝謝喬 - 這真是一種魅力!這非常好,我會把它放在我有的其他編碼中! – lara400

+0

如何實際捕獲特定的異常 - 我知道VS拋出異常 - 我應該只是複製該異常並將其放入「異常」框中 - catch(EXCEPTION) – lara400

+0

「如何捕獲特定的異常」 - 如果您在catch塊中放置一個斷點,您可以檢查拋出的異常以獲取其類型。我懷疑它是一個'ManagementException'或'KeyNotFoundException'。 – Joe

2

我認爲,當有在數據表

if (moDisk.Columns.Contains("systemname")) 
{ 
    lblSystemName.Text = "SystemName: " + moDisk["systemname"]; 
} 
else 
{ 
    lblSystemName.Text = "SystemName: WMI Error"; 
} 

注意對於給定的列中沒有數據avaialbe埃羅發生:不知道這是數據表或沒有,但你可以像這樣的代碼,而不是捕捉異常對於每個值...在if的幫助下,你可以很容易地編碼

+0

這是偉大的,但對不起,我沒有具體說明,如果我有一個數據庫或沒有...我沒有先進的數據庫的工作尚未:-)這是一個簡單的標籤,需要填充...雖然我會保持這是因爲我可能需要這個以防萬一我有數據庫要求。謝謝! – lara400

1

我覺得使用這些很多嘗試抓住並不好。如果我是你,我會在下面的方法完成..如果嘗試趕上真的需要。

private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e) 
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'"); 
string current= string.Empty; 
foreach (ManagementObject moDisk in mosDisks.Get()) 
{ 
    try 
    { 
     current = "SystemName"; 
     lblSystemName.Text = "SystemName: " + moDisk["systemname"]; 


     current = "MediaType"; 
     lblType.Text = "Type: " + moDisk["MediaType"].ToString(); 

    } 
    catch(Exception) 

    { 
      //print "error in" + current; 

} 
}