gpt4 book ai didi

c# - 如何捕获 system.xml.xml 异常

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:37 24 4
gpt4 key购买 nike

我发布了一个适用于 Windows Phone 8 智能手机的小型免费应用程序(以了解 C# - 所以我是编程初学者)。我的很多用户似乎对这些功能非常满意,但其中一些用户似乎一直在随机崩溃(例如在加拿大:http://www.windowsphone.com/en-ca/store/app/picture-of-the-day/fc977a34-c09d-4c70-8a7b-66b6f09ab7f0)我从未在我的测试设备上遇到过此类崩溃,并试图通过添加更多 try-catch 语句来消除它们 - 但没有成功。

崩溃报告说明如下:

Frame Image Function Offset        
0 system_xml_ni System.Xml.XmlTextReaderImpl.Throw 0x00000036
1 system_xml_ni System.Xml.XmlTextReaderImpl.ParseDocumentContent 0x00000438
2 system_xml_ni System.Xml.XmlTextReaderImpl.Read 0x00000036
3 system_xml_linq_ni System.Xml.Linq.XDeclaration..ctor 0x00000072
4 system_xml_linq_ni System.Xml.Linq.XDocument.Load 0x0000010a
5 system_xml_linq_ni System.Xml.Linq.XDocument.Load 0x00000042
6 system_xml_linq_ni System.Xml.Linq.XDocument.Load 0x00000006
7 phoneapp1_ni PhoneApp1.MainPage+__c__DisplayClassb._doLoadURL_b__6 0x00000040
8 system_net_ni System.Net.WebClient.OnOpenReadCompleted 0x00000010
9 system_net_ni System.Net.WebClient.OpenReadOperationCompleted 0x00000034`

我认为负责的实际代码:

try 
{
WebClient client = new WebClient();
client.OpenReadAsync(new Uri(Url, UriKind.Absolute));
client.OpenReadCompleted += (sender, e) =>
{
if (e.Error != null)
{
return;
}
else
{
System.Xml.Linq.XDocument xmlDoc = XDocument.Load(e.Result);
IEnumerable<string> strTestURL = from node in xmlDoc.Descendants("url") select node.Value;
IEnumerable<string> strTestDescription = from node in xmlDoc.Descendants("copyright") select node.Value;
IEnumerable<string> strTestDate = from node in xmlDoc.Descendants("enddate") select node.Value;
string strURL = "http://www.bing.com" + strTestURL.First();
strURL = strURL.Replace("1366x768", "800x480");
Global.URL1 = strURL;
Global.URLs[i] = strURL;
Global.Descriptions[i] = strTestDescription.First();
Uri Uri = new Uri(Global.URLs[i], UriKind.Absolute);
Imageallgemein.Source = new BitmapImage(Uri);
Imageallgemein.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(onImageTap);
Imageallgemein.Hold += new EventHandler<System.Windows.Input.GestureEventArgs>(onImageTap);
Description.Text = Global.Descriptions[i];
string Year = strTestDate.First().Substring(0, 4);
string Month = strTestDate.First().Substring(4, 2);
string Day = strTestDate.First().Substring(6, 2);
Date.Text = Day + "." + Month + "." + Year;
}
};
}
catch
{
MessageBox.Show(AppResources.Abort, AppResources.msgBoxUrlLoadError, MessageBoxButton.OK);
}

try-catch好像没有效果,希望有人能帮我解决。

最佳答案

e.Result 提供的 XML 一定有问题。关于此的详细信息可能在 XmlException 消息中,但您只包含了堆栈跟踪的一部分。

您必须首先找出问题所在,如果您无法重现问题,则可能必须在调用 XDocument.Load 之前添加一些日志记录在您自己的系统上。

您还可以添加一个异常处理程序,但这并不能解决问题,但会使您的应用程序更加健壮,并允许它在发生意外情况时提供稍微更好的用户界面。您所做的是在对 WebClient 方法的调用周围添加一个异常处理程序,但您没有捕获 client.OpenReadCompleted 的处理程序抛出的异常。这是一个将在线程池线程上执行的异步回调,该线程抛出的任何未捕获的异常都将终止您的应用。

您需要使用如下代码处理异常:

client.OpenReadCompleted += (sender, e) =>
{
try
{
if (e.Error != null)
{
return;
}
else
....
}
catch (Exception ex)
{
.... log and report the exception to allow the app to continue
}
}

如果您决定将日志记录添加到您的应用程序,那么如果您记录 ex.ToString() 返回的整个文本,这将对您非常有用。这将为您提供问题的良好文本描述,包括内部异常和完整堆栈跟踪。

关于c# - 如何捕获 system.xml.xml 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com