防止引发异常
本文关键字:异常 | 更新日期: 2023-09-27 17:57:00
我正在使用以下代码解析以下html:
var exroom = (from roomItem in
doc.DocumentNode.SelectNodes("//div[@class='dias']//h2")
from s in roomItem.NextSibling.NextSibling.SelectNodes(".//label")
let rName = roomItem.InnerText.CleanInnerText()
select new
{
roomID = rName,
Pers = 2,
Currency = "EUR",
rateName = s.InnerText.CleanInnerText(),
roomName = rName,
Price = PriceHelper.Convert(PriceRegEx.Match(s.Attributes["precio"].Value.CleanInnerText()).Groups["price"].Value)
}
).ToArray();
但是当我解析没有上述标签的 html 内容时,它会引发异常,我如何防止在解析时引发异常并为 exroom 数组返回 0 ?例如我在类 das 中没有任何元素。
分三步拆分处理。
- 选择类"DIAS"的元素
- 选中所选变量,仅当它不同于 null 时才继续处理
- 其余的处理过程
因为您在 exroom 变量中有匿名类型对象数组,所以创建空数组可能会很棘手。
我建议将该类型包装在某个类中:
public class RoomItem {
public string roomID { get; set; }
public string Pers { get; set; }
...
}
然后选择 exroom 变量将如下所示:
var diasElements = doc.DocumentNode.SelectNodes("//div[@class='dias']//h2");
var exroom = new RoomItem[] { };
if(null != diasElements) {
exroom = (from roomItem in diasElements
from s in roomItem.NextSibling.NextSibling.SelectNodes(".//label")
let rName = roomItem.InnerText.CleanInnerText()
select new RoomItem
{
roomID = rName,
Pers = 2,
Currency = "EUR",
rateName = s.InnerText.CleanInnerText(),
roomName = rName,
Price =
PriceHelper.Convert(
PriceRegEx.Match(s.Attributes["precio"].Value.CleanInnerText()).Groups["price"].Value)
}
).ToArray()
}
从您的示例代码来看,带有类"dias"的元素的空列表应该会导致某种形式的错误消息(可能是抛出/捕获异常,或者使BookingEngineResponse适应传递有关空dias集合的信息)。
编辑:答案在完整代码示例后澄清。
据我所知,如果 LINQ 中的两个.SelectNodes()
中的任何一个都没有产生任何结果,您不会收到异常。我认为您的查询还有另外两个部分可能会引发异常:
-
与
NextSibling
分开,如果当前roomItem
没有下一个兄弟姐妹或下一个兄弟姐妹。您可以将此部分更改为纯 XPath而不是访问NextSibling
属性。使用纯XPath更省钱,它如果没有元素与整个查询匹配,则安全不返回任何结果。 -
如果当前
s
没有属性"precio",则与Attributes["precio"]
部分。您可以使用GetAttributeValue("attrName", "defaultValue")
替换此部分,如果属性不存在,此方法将返回默认值。
演示上述建议的代码:
from roomItem in doc.DocumentNode.SelectNodes("//div[@class='dias']//h2")
from s in roomItem.SelectNodes("./following-sibling::*[2]//label")
let rName = roomItem.InnerText.CleanInnerText()
select new
{
roomID = rName,
Pers = 2,
Currency = "EUR",
rateName = s.InnerText.CleanInnerText(),
roomName = rName,
Price = PriceHelper.Convert(PriceRegEx.Match(s.GetAttributeValue("precio","").CleanInnerText()).Groups["price"].Value)
}