0

У меня этот код:Как определить, какой элемент вызывает переполнение?

String testData = File.ReadAllText("siteQueryTest.txt"); 
XDocument xmlDoc = XDocument.Parse(testData); 
List<SiteQuery> sitequeries = 
(from sitequery in xmlDoc.Descendants("SiteQuery") 
    select new SiteQuery 
    { 
     Id = Convert.ToInt32(sitequery.Element("Id").Value), 
     UPCPackSize = Convert.ToInt32(sitequery.Element("UPCPackSize").Value), 
     UPC_Code = sitequery.Element("UPC_Code").Value, 
     crvId = sitequery.Element("crvId").Value, 
     dept = Convert.ToInt32(sitequery.Element("dept").Value), 
     description = sitequery.Element("description").Value, 
     openQty = Convert.ToDouble(sitequery.Element("openQty").Value), 
     packSize = Convert.ToInt32(sitequery.Element("packSize").Value), 
     subDept = Convert.ToInt32(sitequery.Element("subDept").Value), 
     unitCost = Convert.ToDecimal(sitequery.Element("unitCost").Value), 
     unitList = Convert.ToDecimal(sitequery.Element("unitList").Value), 
     vendorId = sitequery.Element("vendorId").Value, 
     vendorItem = sitequery.Element("vendorItem").Value, 
    }).ToList<SiteQuery>(); 

Testdata является:

<SiteQueries><SiteQuery><Id>00006000002</Id><UPCPackSize>1</UPCPackSize><UPC_Code>00006000002</UPC_Code><crvId></crvId><dept>8</dept><description>ZZ</description><openQty>0.0</openQty><packSize>1</packSize><subDept>80</subDept><unitCost>1.25</unitCost><unitList>5.0</unitList><vendorId>CONFLICT</vendorId><vendorItem>123456</vendorItem></SiteQuery> 
. . . // gazillions of other SiteQuery "records" 
<SiteQuery><Id>5705654</Id><UPCPackSize>1</UPCPackSize><UPC_Code>5705654</UPC_Code><crvId></crvId><dept>2</dept><description>what do you want</description><openQty>0.0</openQty><packSize>1</packSize><subDept>0</subDept><unitCost>0.55</unitCost><unitList>1.62</unitList><vendorId></vendorId><vendorItem></vendorItem></SiteQuery></SiteQueries> 

Но я получаю следующее исключение во время выполнения с помощью этого кода и данных:

System.OverflowException was unhandled 
    _HResult=-2146233066 
    _message=Value was either too large or too small for an Int32. 
    HResult=-2146233066 
    IsTransient=false 
    Message=Value was either too large or too small for an Int32. 
    Source=mscorlib 
    StackTrace: 
     at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
     at System.Convert.ToInt32(String value) 
     at Sandbox.Form1.<button56_Click>b__e(XElement sitequery) in c:\HoldingTank\Sandbox\Form1.cs:line 2041 
     at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    . . . 
    InnerException: 

Есть несколько ИНТ значения (4) в каждой xml-записи; есть тысячи записей. Как я могу, не пытаясь надеть шляпу Rainman (которая мне не очень подходит), определяет, какое значение представляет собой проблема, вызывающая переполнение или недополнение?

Если это недопустимое (исключение msg говорит, что оба «OverflowException» и «Значение было слишком большим или слишком маленьким для Int32», может ли это быть причиной пустым значением для одного из этих четырех членов int? , как я могу сказать ему, чтобы считать пустое значение как 0

+4

Поймайте исключение, перерыв в обработчике, проверьте ВАР и За ходом процесса? –

+1

Почему бы не использовать десятичное значение вместо int? – DrKoch

+2

'В нем написано:' c: \ HoldingTank \ Sandbox \ Form1.cs: строка 2041', какая строка? – jessehouwing

ответ

4

Вот почему большинство кодеров в конечном итоге, используя методы расширения, но не LINQ Перепишите, как:.

private static SiteQuery ParseSiteQuery(XElement sitequery) 
{ 
    return new SiteQuery 
    { 
     Id = Convert.ToInt32(sitequery.Element("Id").Value), 
     UPCPackSize = Convert.ToInt32(sitequery.Element("UPCPackSize").Value), 
     UPC_Code = sitequery.Element("UPC_Code").Value, 
     crvId = sitequery.Element("crvId").Value, 
     dept = Convert.ToInt32(sitequery.Element("dept").Value), 
     description = sitequery.Element("description").Value, 
     openQty = Convert.ToDouble(sitequery.Element("openQty").Value), 
     packSize = Convert.ToInt32(sitequery.Element("packSize").Value), 
     subDept = Convert.ToInt32(sitequery.Element("subDept").Value), 
     unitCost = Convert.ToDecimal(sitequery.Element("unitCost").Value), 
     unitList = Convert.ToDecimal(sitequery.Element("unitList").Value), 
     vendorId = sitequery.Element("vendorId").Value, 
     vendorItem = sitequery.Element("vendorItem").Value, 
    }; 
} 

, а затем сделать

List<SiteQuery> sitequeries = xmlDoc.Descendants("SiteQuery") 
            .Select(ParseSiteQuery).ToList(); 

Теперь, когда возникает исключение, вы будете ломать внутри этой функции преобразования, с областью sitequery, давая немедленное знание того, какой именно XElement вызвал сбой.

Затем вы можете использовать выражения quickwatch, чтобы быстро узнать, какой инициализатор вызвал исключение. Или даже писать отдельные инструкции для каждого присвоения собственности.

0

Это то, что в конечном итоге работает:

private void button42_Click(object sender, EventArgs e) 
    { 
     ArrayList arrList = 
    FetchSiteQuery("http://localhost:21608/api/sitequery/getall/dbill/ppus/42"); 
     String omnivore = "<SiteQueries>"; 
     foreach (String s in arrList) //- see siteQueryData.png 
     { 
      omnivore += s; 
     } 
     omnivore += "</SiteQueries>"; 

     String messedUpJunk = "<ArrayOfSiteQuery xmlns:i=\"http://www.w3.org/2001/XMLSchema- 
    instance\" xmlns=\"http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS\">"; 
     omnivore = omnivore.Replace(messedUpJunk, String.Empty); 
     omnivore = omnivore.Replace("</ArrayOfSiteQuery>", String.Empty); 

     XDocument xmlDoc = XDocument.Parse(omnivore); 
     List<SiteQuery> sitequeries = 
    xmlDoc.Descendants("SiteQuery").Select(GetSiteQueryForXMLElement).ToList(); 
    } 

    private static SiteQuery GetSiteQueryForXMLElement(XElement sitequery) 
    { 
     return new SiteQuery 
     { 
      Id = sitequery.Element("Id").Value, 
      UPCPackSize = Convert.ToInt32(sitequery.Element("UPCPackSize").Value), 
      UPC_Code = sitequery.Element("UPC_Code").Value, 
      crvId = sitequery.Element("crvId").Value, 
      dept = Convert.ToInt32(sitequery.Element("dept").Value), 
      description = sitequery.Element("description").Value, 
      openQty = Convert.ToDouble(sitequery.Element("openQty").Value), 
      packSize = Convert.ToInt32(sitequery.Element("packSize").Value), 
      subDept = Convert.ToInt32(sitequery.Element("subDept").Value), 
      unitCost = Convert.ToDecimal(sitequery.Element("unitCost").Value), 
      unitList = Convert.ToDecimal(sitequery.Element("unitList").Value), 
      vendorId = sitequery.Element("vendorId").Value, 
      vendorItem = sitequery.Element("vendorItem").Value, 
     }; 
    }