【发布时间】:2021-04-04 23:21:28
【问题描述】:
我正在使用 XPathSelectElement 从 XML 文件中获取一些元素。当 XML 文件中存在这些元素时,它会起作用。如果所选元素不在 XML 中,它自然会引发“空引用”异常。这很好。我希望它能做到这一点。但是,如果 XPathSelectElement 为空,我希望能够捕获该异常并且不执行任何操作。
按预期工作的代码:
public void LoadBonusDescription()
{
string Race = CharRaceSelector.Text;
string bonus = RequirementsBox.Text;
XDocument doc = XDocument.Load($"{Gamepath}");
string description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description").Value;
//DescriptionBox is a listBox
DescriptionBox.Text = description;
}
我尝试加入 if 声明,例如:
if (description == null)
{
return;
}
else
{
DescriptionBox.Text = description;
}
但它并没有命中那部分,并在此处的字符串变量赋值处抛出异常:
string description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description").Value;
如何在变量赋值之前(或期间)捕获异常以运行if 语句?
如果我无法捕捉到它,有没有办法禁用DescriptionBox 列表框而不是将框中的文本变为灰色(就像DescriptionBox.Enabled = false; 一样)?
基本上我想阻止用户选择 XML 文件中不可用的项目。
【问题讨论】:
-
var descriptionElement = doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description"); if(description != null && description.Value != null) { DescriptionBox.Text = description; }
-
只需使用null conditional operator
doc.XPathSelectElement($"...")?.Value; -
或者只是在
XElement上使用explicit string cast 而不是明确获取Value:(string)doc.XPathSelectElement($"..."); -
@dbc ```
var description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description"); if (description == null) { return; } else { DescriptionBox.Text = description; }完美运行!谢谢!