Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试着抓住问题_C#_C# 4.0 - Fatal编程技术网

C# 试着抓住问题

C# 试着抓住问题,c#,c#-4.0,C#,C# 4.0,有什么更好的方法来做下面的尝试捕捉?目前,每个WMI字段都有自己的try-catch语句 我不想把整个类放到一个巨大的try-catch中,因为我遇到了字段没有显示任何内容的问题(尝试了这个,但对于我正在做的事情来说效果不好) 我有大约25个其他WMI字段需要输入,我想知道是否有一种更简单的方法来实现这一点 private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e) ManagementObjectSearcher m

有什么更好的方法来做下面的尝试捕捉?目前,每个WMI字段都有自己的try-catch语句

我不想把整个类放到一个巨大的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";
    }
}

我认为,当datatable中给定列没有可用数据时,就会发生错误

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

注意:不确定这是否是datatable,但您可以这样编码,而不是捕获每个值的异常。。。在if..else的帮助下,您可以轻松地编写此代码

我认为,当datatable中给定列没有可用数据时,会发生错误

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

注意:不确定这是否是datatable,但您可以这样编码,而不是捕获每个值的异常。。。在if..else的帮助下,您可以轻松编写此代码

我觉得使用这些多个try-catch并不好。如果我是你的话,我会用下面的方法来做……如果真的需要的话

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;

}
}

我觉得用这么多的试捕是不好的。如果我是你的话,我会用下面的方法来做……如果真的需要的话

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;

}
}

您可以使用助手方法:

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 indexer可以引发哪些异常)。

您可以使用帮助器方法:

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 indexer可以引发哪些异常)。

为什么会在那里出现异常?我会研究原因,而不是症状。只有当moDisk[“MediaType”]为空时,才会生成异常。但这可以通过使用if-else语句来阻止。问题是,如果我有一个WMI字段,例如“availability”,那么将在其中一个服务器上运行此操作的服务器将不会有“availability”,原因是什么(这很好)。但是,“Availability”之后的下一个WMI字段可能是“FirmwareVersion”(它确实存在)。但是,由于“Availability”返回了一个异常(wmi类不存在),因此我注意到“FirmwareVersion”随后将不显示任何内容(即使它应该显示)。有人告诉我,这是因为我在方法中有一个大量的try-catch,它得到一个异常,直接去捕捉,而不是继续。为什么会有异常?我会研究原因,而不是症状。只有当moDisk[“MediaType”]为空时,才会生成异常。但这可以通过使用if-else语句来阻止。问题是,如果我有一个WMI字段,例如“availability”,那么将在其中一个服务器上运行此操作的服务器将不会有“availability”,原因是什么(这很好)。但是,“Availability”之后的下一个WMI字段可能是“FirmwareVersion”(它确实存在)。但是,由于“Availability”返回了一个异常(wmi类不存在),因此我注意到“FirmwareVersion”随后将不显示任何内容(即使它应该显示)。有人告诉我,这是因为我有一个巨大的尝试捕捉的方法,是得到一个例外,直接去捕捉,而不是继续。谢谢乔-这工作的魅力!这是如此好,我会把这个在其他编码我有!如何实际捕获特定异常-我知道VS抛出异常-我是否应该复制该异常并将其放入“异常”框-catch(exception)“如何实际捕获特定异常”-如果在catch块中放置断点,可以检查抛出的异常以获取其类型。我怀疑这是
ManagementException
KeyNotFoundException
。谢谢你,乔-这很有魅力!这是如此好,我会把这个在其他编码我有!如何实际捕获特定异常-我知道VS抛出异常-我是否应该复制该异常并将其放入“异常”框-catch(exception)“如何实际捕获特定异常”-如果在catch块中放置断点,可以检查抛出的异常以获取其类型。我怀疑这是一个
ManagementException
KeyNotFoundException
。这很好,但很抱歉我没有说明我是否有数据库…我还没有那么先进的数据库工作:-)这是一个需要填充的简单标签…虽然我会保留这个,因为我可能需要它,以防我有数据库需求。谢谢这是伟大的,但很抱歉,我没有具体说明,如果我有一个数据库或没有…我还没有先进的工作数据库的:-)这是一个简单的标签,需要填充…虽然我会保留这一点,因为我可能需要它的情况下,我有一个数据库的要求。谢谢