c# - 防止引发异常

标签 c# parsing exception html-agility-pack raiserror

我正在使用以下代码解析以下 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 ?比如我在 dias 类中没有任何元素。

最佳答案

将处理分为三个步骤。

  • 选择“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 集合的信息)。

编辑: 完整代码示例后答案得到澄清。

关于c# - 防止引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908283/

相关文章:

c# - 无法使用打开的 xml 在 word 中找到合并字段

perl - 在 Hammer 解析器组合器中,如何实现引用自身的规则?

ios - 解析动态 JSON 的模型

c# - 字符串到数字的转换和组分隔符

c# - 奇怪的 try/catch block 行为

ios - 当我在设备中运行我的应用程序时出现 dyld`gdb_image_notifier 异常

java - int 的三个异常(exception)

c# - 创建可重用的项目和解决方案结构

C# - 对锁感到困惑

c# - 大开关的替代品?