我发布了一个适用于Windows 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);
}似乎没什么效果,我希望有人能帮我解决这个问题。
发布于 2014-07-03 11:46:03
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()返回的全部文本,它将对您非常有用。这将为您提供问题的良好文本描述,包括内部异常和完整堆栈跟踪。
发布于 2014-07-03 11:49:34
通常,做catch(Exception)是很好的实践,在您的例子中是catch(system.xml.XmlException)。但是,在else块中放置一个try-catch,因为这是一个异步事件,如果发生异常,将不会捕获该异常中的某些异常:
try 
{
    WebClient client = new WebClient();
    client.OpenReadAsync(new Uri(Url, UriKind.Absolute));
    client.OpenReadCompleted += (sender, e) =>
    {
        if (e.Error != null)
        {
            return;
        }
        else
        {
           try
           {
              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 (XmlException)
           {
                MessageBox.Show(AppResources.Abort, AppResources.msgBoxUrlLoadError, MessageBoxButton.OK);
           }
        }
    };
}
catch (Exception)
{
    MessageBox.Show(AppResources.Abort, AppResources.msgBoxUrlLoadError, MessageBoxButton.OK);
}https://stackoverflow.com/questions/24551440
复制相似问题