【发布时间】:2011-12-28 09:23:59
【问题描述】:
我的崩溃报告系统告诉我一个异常到达了 Unhandled Exception 处理程序,并且查看产生此异常的代码,我看不出这是如何发生的。代码是完全同步的,并且包含在 try/抓住。
澄清:此代码在 Windows Phone 7 上运行,异常发生在生产环境中不受控制的环境(即在用户的设备上)。
代码如下:
private void LoadUserData()
{
try
{
UserData = UserData.Deserialize(UserDataFileName, true);
// We succeeded. Backup the file, if possible.
if (IsoFile.Store.FileExists(UserDataFileName))
{
try
{
IsoFile.CopyFile(UserDataFileName, UserDataFileBackupName);
}
catch (Exception ex)
{
EventManager.Current.ShipAssert("LoadUserData.Backup", ex);
}
}
}
catch (Exception ex)
{
string currentFile = "";
try
{
currentFile = IsoFile.ReadAllLines(UserDataFileName);
}
catch (Exception exInner)
{
currentFile = "Exception when trying to read file: " + exInner.ToString();
}
}
}
以及到达未处理异常处理程序的异常:
System.InvalidOperationException: There is an error in XML document (129, 54). ---> System.InvalidOperationException: There is an error in XML document (129, 54). ---> System.Xml.XmlException: Unexpected end of file has occurred. The following elements are not closed: value, item, VotedUrls, UserData. Line 129, position 54. at
System.Xml.XmlTextReaderImpl.Throw(Exception e) at
System.Xml.XmlTextReaderImpl.Throw(Int32 res, String resString, String arg) at
System.Xml.XmlTextReaderImpl.Throw(Int32 pos, Int32 res, String resString, String arg) at
System.Xml.XmlTextReaderImpl.ThrowUnclosedElements() at
System.Xml.XmlTextReaderImpl.ParseElementContent() at
System.Xml.XmlTextReaderImpl.Read() at
System.Xml.XmlTextReader.Read() at
System.Xml.XmlReader.ReadEndElement() at
System.Xml.Serialization.XmlSerializationReader.DeserializePrimitiveElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at
System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.DeserializeElement(Accessor accessor, Fixup fixup) at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at
SocialEbola.Shared.Utils.SerializableDictionary`2.ReadXml(XmlReader reader) at
System.Xml.Serialization.XmlSerializationReader.DeserializeSerializableElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at
System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement) at
System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.DeserializeComplexElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at
System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.DeserializeElement(Accessor accessor, Fixup fixup) at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at
System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) at
SocialEbola.Lib.Serialization.SerializeHelper`1.Deserialize(Stream stream) at
SocialEbola.Lib.Serialization.SerializeHelper`1.Deserialize(String file, Boolean createNew) at
Fails.App.LoadUserData() at
Fails.App.Application_Launching(Object sender, LaunchingEventArgs e) at
Microsoft.Phone.Shell.PhoneApplicationService.FireLaunching() at
Microsoft.Phone.Execution.NativeEmInterop.FireOnLaunching() at
System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at
SocialEbola.Shared.Utils.SerializableDictionary`2.ReadXml(XmlReader reader) at
System.Xml.Serialization.XmlSerializationReader.DeserializeSerializableElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue) at
System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement) at
System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget) at
System.Xml.Serialization.XmlSerializationReader.D
这是 UserData.Deserialize 的代码(来自模板基类):
public static T Deserialize(string file, bool createNew)
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
T result;
if (!store.FileExists(file))
{
if (createNew)
{
result = new T();
}
else
{
result = default(T);
}
}
else
{
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(file, FileMode.Open, store))
{
result = Deserialize(stream);
}
}
return result;
}
public static T Deserialize(Stream stream)
{
T t = (T)Serializer.Deserialize(stream);
return t;
}
而Serializer在基类中定义为:
public static XmlSerializer Serializer = new XmlSerializer(typeof(T));
【问题讨论】:
-
社交埃博拉病毒+1。我喜欢社交病毒。
-
你能告诉我们
UserData.Deserialize方法吗?它可能会做一些引发异常的异步工作。 -
@Shahar Prish 您确定堆栈跟踪源自您粘贴的代码吗?你是在 Visual Studio 下运行还是独立运行?
-
@Erno:在这种情况下,异常不会发生在异步线程上而不是该线程上吗? (我可以粘贴代码,但没有什么异步的。让我知道你的想法。
-
@Wal:这是我拥有的唯一具有该签名的方法。这在用户设备(Windows Phone)上作为独立的生产环境运行,并通过我拥有的崩溃报告机制向我报告[我将添加说明]
标签: c# .net exception windows-phone-7