我继承了一个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的哪个对象抛出异常?我可以放弃给我的批处理概念,但如果出于性能原因,我宁愿避免这样做。
答案 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,随意改进这种设计。