0

以下のトライキャッチを行うためのより良い方法は何ですか?現在、各WMIフィールドには独自のtrycatchステートメントがあります。

フィールドに何も表示されないという問題があるので、クラス全体を大規模なトライキャッチに入れたくありません(これを試してみましたが、私が行っていることにはうまくいきません)。

他に約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";
    }
}
4

3 に答える 3

2

datatableの特定の列に利用可能なデータがない場合にエラーが発生すると思います

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

注:これがデータテーブルであるかどうかはわかりませんが、各値の例外をキャッチする代わりに、このようにコーディングできます... if ..elseを使用すると、これを簡単にコーディングできます

于 2012-09-25T09:42:42.070 に答える
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インデクサーによってスローされる可能性のある例外がわからない)。

于 2012-09-25T09:49:18.007 に答える
1

これらのトライキャッチを多用するのは良くないと思います。もし私がuiだったら、次の方法でやったでしょう。

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;

}
}
于 2012-09-25T09:47:54.800 に答える