Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Try-Catch块添加到XAML代码_C#_Linq_Xaml_Try Catch - Fatal编程技术网

C# 将Try-Catch块添加到XAML代码

C# 将Try-Catch块添加到XAML代码,c#,linq,xaml,try-catch,C#,Linq,Xaml,Try Catch,我有以下代码,需要添加一个try-catch块,因为例如,如果提供的字符串错误,convert-to-integer可能无法正常工作。问题只在极少数情况下出现,但我当然希望避免崩溃 private async Task<List<MyItem>> ParseFeed(string text) { XNamespace ns = "http://mynamespace/"; return await Task.Run(() => {

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

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();
    });
}
private async Task ParseFeed(字符串文本)
{
XNS=”http://mynamespace/";
返回等待任务。运行(()=>
{
var xdoc=XDocument.Parse(文本);
返回(来自xdoc.subjects(“项”)中的XElement项)
选择新的MyItem
{
Subject=(字符串)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”不是整数,我想跳过此项并处理所有其他项。这样行吗?
非常感谢!

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

您有两个选择:

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

第二种方法是将
int
转换提取到一个单独的方法中,该方法执行try/catch,例如,返回一个指示成功和值的元组,尽管这可以通过使用
选项
类型(如我自己提供的)大大简化。它支持提供值或不提供值:

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")
                let possibleItemID = item.Element(ns + "ItemID").ParseInt()
                where possibleItemID.HasValue
                select new MyItem
                {
                    Subject = (string)item.Element(ns + "Subject"),
                    CreationDate = (System.DateTime)System.DateTime.Parse((string)item.Element(ns + "CreationDate")),
                    ItemID = possibleItemID.Value
                }).ToList();
    });
}
private async Task ParseFeed(字符串文本)
{
XNS=”http://mynamespace/";
返回等待任务。运行(()=>
{
var xdoc=XDocument.Parse(文本);
返回(来自xdoc.subjects(“项”)中的XElement项)
让possibleItemID=item.Element(ns+“ItemID”).ParseInt()
如果可能,emid.HasValue
选择新的MyItem
{
Subject=(字符串)item.Element(ns+“Subject”),
CreationDate=(System.DateTime)System.DateTime.Parse((string)item.Element(ns+“CreationDate”),
ItemID=可能的ItemID.Value
}).ToList();
});
}

简而言之,你不能用你描述的方式使用try/catch

您有两个选择:

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

第二种方法是将
int
转换提取到一个单独的方法中,该方法执行try/catch,例如,返回一个指示成功和值的元组,尽管这可以通过使用
选项
类型(如我自己提供的)大大简化。它支持提供值或不提供值:

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")
                let possibleItemID = item.Element(ns + "ItemID").ParseInt()
                where possibleItemID.HasValue
                select new MyItem
                {
                    Subject = (string)item.Element(ns + "Subject"),
                    CreationDate = (System.DateTime)System.DateTime.Parse((string)item.Element(ns + "CreationDate")),
                    ItemID = possibleItemID.Value
                }).ToList();
    });
}
private async Task ParseFeed(字符串文本)
{
XNS=”http://mynamespace/";
返回等待任务。运行(()=>
{
var xdoc=XDocument.Parse(文本);
返回(来自xdoc.subjects(“项”)中的XElement项)
让possibleItemID=item.Element(ns+“ItemID”).ParseInt()
如果可能,emid.HasValue
选择新的MyItem
{
Subject=(字符串)item.Element(ns+“Subject”),
CreationDate=(System.DateTime)System.DateTime.Parse((string)item.Element(ns+“CreationDate”),
ItemID=可能的ItemID.Value
}).ToList();
});
}

就个人而言,我只是从Linq切换到常规的
foreach
循环,并使用
TryParse
方法

var xdoc = XDocument.Parse(text);
var list = new List<MyItem>();
foreach(var item in xdoc.Descendants("item"))
{
    DateTime creationDate;
    int itemId;
    if(int.TryParse((string)item.Element(ns + "ItemID"),out itemId)
       && DateTime.TryParse((string)item.Element(ns + "CreationDate"), out creationDate))
    {
        list.Add(new MyItem
            {
                Subject = (string)item.Element(ns + "Subject"),
                CreationDate = creationDate,
                ItemID = itemId
            });
    }
}

return list;
var xdoc=XDocument.Parse(文本);
var list=新列表();
foreach(xdoc.subjects(“项”)中的变量项)
{
创建日期时间;
int itemId;
if(int.TryParse((string)item.Element(ns+“ItemID”),out ItemID)
&&DateTime.TryParse((字符串)item.Element(ns+“CreationDate”),out CreationDate))
{
列表。添加(新的MyItem)
{
Subject=(字符串)item.Element(ns+“Subject”),
CreationDate=CreationDate,
ItemID=ItemID
});
}
}
退货清单;

就个人而言,我只是从Linq切换到常规的
foreach
循环,并使用
TryParse
方法

var xdoc = XDocument.Parse(text);
var list = new List<MyItem>();
foreach(var item in xdoc.Descendants("item"))
{
    DateTime creationDate;
    int itemId;
    if(int.TryParse((string)item.Element(ns + "ItemID"),out itemId)
       && DateTime.TryParse((string)item.Element(ns + "CreationDate"), out creationDate))
    {
        list.Add(new MyItem
            {
                Subject = (string)item.Element(ns + "Subject"),
                CreationDate = creationDate,
                ItemID = itemId
            });
    }
}

return list;
var xdoc=XDocument.Parse(文本);
var list=新列表();
foreach(xdoc.subjects(“项”)中的变量项)
{
创建日期时间;
int itemId;
if(int.TryParse((string)item.Element(ns+“ItemID”),out ItemID)
&&DateTime.TryParse((字符串)item.Element(ns+“CreationDate”),out CreationDate))
{
列表。添加(新的MyItem)
{
Subject=(字符串)item.Element(ns+“Subject”),
CreationDate=CreationDate,
ItemID=ItemID
});
}
}
退货清单;

如果您只是担心
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();

如果您只是担心
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();

您可以使用静态方法将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();
    });
}

您可以使用静态方法将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();
    });
}