将Try-Catch Block添加到XAML代码

时间:2016-01-13 17:50:28

标签: c# linq xaml try-catch

我有以下代码,需要添加try-catch-block,例如如果提供的字符串错误,转换为整数可能无法正常工作。问题仅在极少数情况下出现,但我当然希望避免崩溃。

private async Task<List<MyItem>> ParseFeed(string text)
{
    XNamespace ns = "http://mynamespace/";
    return await Task.Run(() =>
    {
        var xdoc = XDocument.Parse(text);
        return (from XElement item in xdoc.Descendants("item")
                select new MyItem
                {
                    Subject = (string)item.Element(ns + "Subject"),
                    CreationDate = (System.DateTime)System.DateTime.Parse((string)item.Element(ns + "CreationDate")),
                    ItemID = (int)item.Element(ns + "ItemID")
                }).ToList();
    });
}

我在几个地方尝试过try-catch但我找不到正确的:-(我应该在哪里添加它?如果“ItemID”没有整数我想跳过这个项目并处理所有其他的。那会有用吗? 非常感谢!

4 个答案:

答案 0 :(得分:2)

简短的回答是你不能以你描述的方式使用try / catch。

您有两种选择:

首先,您可以放弃LINQ并使用标准foreachlist.Add()并使用try / catch。

第二种方法是将int转换提取到一个执行try / catch的单独方法中,例如,返回一个指示成功和值的元组,尽管使用{{{}可以大大简化这一点。 1}}类型,例如由我自己的Succinc<T> library提供的。它支持提供值或不提供:

Option<int>

答案 1 :(得分:2)

如果您只是担心ItemID不是整数,那么添加一个where子句:

int itemId;
return (from XElement item in xdoc.Descendants("item")
        where int.TryParse(item.Element(ns + "ItemID"), out itemId)
        select new MyItem
        {
            Subject = (string)item.Element(ns + "Subject"),
            CreationDate = (System.DateTime)System.DateTime.Parse((string)item.Element(ns + "CreationDate")),
            ItemID = itemId
        }).ToList();

答案 2 :(得分:1)

您可以使用可以将string / object / T转换为Int32的静态方法,并处理转换期间抛出的任何异常。请注意,您不能将这些方法用于LINQ to Entities / Xml,而是在第一次选择后需要调用.ToList(),这将是原始数据而不是.select(...那将是原始数据使用所需的转换方法。这是代码示例。

private async Task<List<MyItem>> ParseFeed(string text)
{


    XNamespace ns = "http://mynamespace/";
    return await Task.Run(() =>
    {
        var xdoc = XDocument.Parse(text);
        return (from XElement item in xdoc.Descendants("item")
                select new
                {
                    Subject = (string)item.Element(ns + "Subject"),
                    CreationDate =    (System.DateTime)System.DateTime.Parse((string)item.Element(ns + "CreationDate")),
                    ItemID = ns 
                }).ToList()
                    .select(x=> new MyItem{
                        x.Subject,
                        x.CreationDate, 
                        ItemID  = SafeConvert.ToInt32(ns)
                    }).ToList();
    });
}

您可以使用以下

等异常处理方式捆绑转化方法
public static class SafeConvert
{
    public static int ToInt32(object number)
    {
        try
        {
            // if (TypeValidator.IsInt(number)) // If you want to check type before cast to avoid any potential exceptions
            return Convert.ToInt32(number);
        }
        catch
        { // Log you exception}
            return 0;
        }
    }
}

答案 3 :(得分:0)

就我个人而言,我只是从Linq切换到常规var progress: Double = 0 var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target:self, selector: Selector("updateProgress"), userInfo: nil, repeats: true) func updateProgress() { guard progress <= 1 else { timer.invalidate() return } progress += 0.01 } 循环并使用foreach方法

TryParse