首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何输入异常捕获?

如何输入异常捕获?
EN

Stack Overflow用户
提问于 2012-09-21 14:29:43
回答 4查看 305关注 0票数 1

我有下面的代码,它通过并返回磁盘信息。在运行时,我注意到我的计算机(即FirmwareRevision)上没有一些WMI属性。

所以,当我运行代码VS时,它会崩溃,说明“找不到”。是否知道如何将异常捕获到对象输出的状态,而不被发现为"Not Available“。

我一直在阅读异常捕获,但到目前为止,我的业余方法是明确定义我想要的异常,use...this程序打算在不同的服务器负载上运行,因此希望它能够智能地计算出任何一台服务器可能没有的WMI对象。

代码如下,目前它在(最后一行)上失败:

"lblFirmware.Text =“固件:”+moDisk"FirmwareRevision".ToString();“

代码:

代码语言:javascript
复制
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();
            }
        }


    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-21 14:32:01

尝尝这个

代码语言:javascript
复制
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)
        {

        }
    }
票数 2
EN

Stack Overflow用户

发布于 2012-09-21 14:33:18

试着替换:

代码语言:javascript
复制
lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();

通过以下方式:

代码语言:javascript
复制
lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"] == null ? "Not Available" :  moDisk["FirmwareRevision"].ToString();
票数 3
EN

Stack Overflow用户

发布于 2012-09-21 14:35:47

这不是对你问题的直接回答,但更好的答案是,你不应该依赖于尝试/抓住。Catch语句适用于您无法忽略或您的程序无法优雅处理的情况。这两种属性都不适用于此--通过在WMI参考中查找哪些属性,您实际上可以提前知道哪些属性会在哪个操作系统上引起问题。

编写应用程序的更健壮的方法是检查正在运行的操作系统,并且只尝试检索已知可用的属性。您仍然应该像其他答案中所示的那样,将其包装在一个try/catch中,以防发生其他意想不到的事情,但这种特殊情况是您可以预料到的,应该编写代码,而不是抛出和捕获异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12532551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档