在List <t>中查找产生异常的项目

时间:2016-04-12 15:41:02

标签: c#

我继承了一个WCF Web服务应用程序,它需要有更好的错误跟踪。我们所做的是从一个系统(AcuODBC)查询数据,并将该数据发送到另一个系统(Salesforce)。此查询将以List<T>的形式返回数千个复杂对象中的10个。然后,我们一次以200个记录的批次处理此List<T>,以将字段映射到另一个对象类型,然后将该批次发送到Salesforce。完成后,下一批开始。这是一个简短的例子:

int intStart = 0, intEnd = 200;
//done in a loop, snipped for brevity
var leases = from i in trleases.GetAllLeases(branch).Skip(intStart).Take(intEnd)
                       select new sforceObject.SFDC_Lease() {
                              LeaseNumber = i.LeaseNumber.ToString(),
                              AccountNumber = i.LeaseCustomer,
                              Branch = i.Branch 
                       (...)//about 150 properties

//do stuff with list and increment to next batch
intStart += 200;

然而,问题是如果一个对象有一个错误的字段映射(Invalid Cast Exception),我想打印出未能记录日志的对象。

问题

有什么方法可以破译200的哪个对象抛出异常?我可以放弃给我的批处理概念,但如果出于性能原因,我宁愿避免这样做。

2 个答案:

答案 0 :(得分:4)

通过非常小的代码更改,这应该可以实现您的目标:

int intStart = 0, intEnd = 200, count = 0;
List<SDFC_Lease> leases = new List<SDFC_Lease>();
//done in a loop, snipped for brevity
foreach(var i in trleases.GetAllLeases(branch).Skip(intStart).Take(intEnd)) {
    try {
        count++;
        leases.Add(new sforceObject.SFDC_Lease() {
                              LeaseNumber = i.LeaseNumber.ToString(),
                              AccountNumber = i.LeaseCustomer,
                              Branch = i.Branch 
                       (...)//about 150 properties);
    } catch (Exception ex) {
       // you now have you culprit either as 'i' or from the index 'count'
    }    
}
//do stuff with 'leases' and increment to next batch
intStart += 200;

答案 1 :(得分:0)

我认为您可以在类SFDC_Lease的属性的每个set方法中使用一个标志,并为此使用静态属性:

public class SFDC_Lease
{
    public static string LastPropertySetted;
    public string LeaseNumber
    {
        get;
        set
        {
           LastPropertySetted = "LeaseNumber";
           LeaseNumber = value;
        }
    }
}

Plz,随意改进这种设计。