C# 试着抓住问题
有什么更好的方法来做下面的尝试捕捉?目前,每个WMI字段都有自己的try-catch语句 我不想把整个类放到一个巨大的try-catch中,因为我遇到了字段没有显示任何内容的问题(尝试了这个,但对于我正在做的事情来说效果不好) 我有大约25个其他WMI字段需要输入,我想知道是否有一种更简单的方法来实现这一点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
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
。这很好,但很抱歉我没有说明我是否有数据库…我还没有那么先进的数据库工作:-)这是一个需要填充的简单标签…虽然我会保留这个,因为我可能需要它,以防我有数据库需求。谢谢这是伟大的,但很抱歉,我没有具体说明,如果我有一个数据库或没有…我还没有先进的工作数据库的:-)这是一个简单的标签,需要填充…虽然我会保留这一点,因为我可能需要它的情况下,我有一个数据库的要求。谢谢