1

私はディスク情報を通過して返す以下のコードを持っています。実行しているときに、一部のWMIプロパティがコンピューターで使用できないことに気付きました(つまり、FirmwareRevision)。

したがって、コードを実行すると、VSがクラッシュして「見つかりません」と表示されます。「利用不可」と表示されていないオブジェクトの出力で、例外キャッチをどのように状態に設定するかについてのアイデア。

私は例外キャッチについて読んでいますが、これまでの私の素人的な方法は、使用したい例外を明示的に定義することです...このプログラムは、さまざまなサーバーの負荷で実行することを目的としているため、任意の1つのサーバーが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に頼るべきではないということです。キャッチステートメントは、予測できない状況、またはプログラムが適切に処理できない状況を対象としています。ここではどちらも当てはまりません。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 に答える