什么是更好的方式来做下面的尝试捕获?目前,我在每个WMI字段中都有自己的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";
}
}
答案 0 :(得分:2)
我认为当数据表
中的给定列没有数据avaialbe时会发生错误if (moDisk.Columns.Contains("systemname"))
{
lblSystemName.Text = "SystemName: " + moDisk["systemname"];
}
else
{
lblSystemName.Text = "SystemName: WMI Error";
}
注意:不确定这是否是数据表但是您可以像这样编码而不是为每个值捕获异常...在if ..else的帮助下,您可以轻松编写代码
答案 1 :(得分: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索引器可以抛出哪些异常)。
答案 2 :(得分:1)
我觉得使用这些很多尝试捕捉并不好。如果我是你,我会按照以下方法做。如果真的需要捕捉。
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;
}
}