我有Android应用程序,它从服务器中提取xml。
public class FeedParser {
private final URL mURL;
public FeedParser(String feedUrl) {
try {
mURL = new URL(feedUrl);
} catch (MalformedURLException e) {
throw new RuntimeException();
}
}
private InputStream getInputStream() throws IOException {
return mURL.openConnection().getInputStream();
}
public FeedItem parseFeed() {
// SAX stuff here
try {
Xml.parse(getInputStream(), Xml.Encoding.UTF_8,
root.getContentHandler());
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
有时,当XML.parse(...)执行时,我会得到异常:
AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
AndroidRuntime: at android.os.AsyncTask$3.done(AsyncTask.java:200)
AndroidRuntime: at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
AndroidRuntime: at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:138)
AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
AndroidRuntime: at java.lang.Thread.run(Thread.java:1019)
AndroidRuntime: Caused by: java.lang.AssertionError: java.net.SocketException: Connection reset by peer
AndroidRuntime: at android.util.Xml.parse(Xml.java:89)
AndroidRuntime: at com.packagename.FeedParser.parseFeed(FeedParser.java:60)
AndroidRuntime: at com.packagename.UpdateService$FeedLookupTask.doInBackground(UpdateService.java:84)
AndroidRuntime: at com.packagename.UpdateService$FeedLookupTask.doInBackground(UpdateService.java:1)
AndroidRuntime: at android.os.AsyncTask$2.call(AsyncTask.java:185)
AndroidRuntime: at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
AndroidRuntime: ... 4 more
AndroidRuntime: Caused by: java.net.SocketException: Connection reset by peer
AndroidRuntime: at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method)
AndroidRuntime: at dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273)
AndroidRuntime: at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458)
AndroidRuntime: at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85)
AndroidRuntime: at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:65)
AndroidRuntime: at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:140)
AndroidRuntime: at java.io.BufferedInputStream.read(BufferedInputStream.java:225)
AndroidRuntime: at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readLine(HttpURLConnectionImpl.java:660)
AndroidRuntime: at org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStream.readChunkSize(ChunkedInputStream.java:77)
AndroidRuntime: at org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStream.read(ChunkedInputStream.java:45)
AndroidRuntime: at java.io.InputStream.read(InputStream.java:157)
AndroidRuntime: at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:516)
AndroidRuntime: at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:479)
AndroidRuntime: at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318)
AndroidRuntime: at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)
如何处理此类错误?
编辑我知道捕获错误是错误的编程风格,我寻求更优雅的解决方案。
答案 0 :(得分:1)
通过对等方重置连接意味着您正在读取的远程服务器正在关闭连接,然后您尝试再次读取它。对于远程端来说,这不一定是网络错误 - 它可以由于多种原因而做到这一点。在不知道服务器协议的情况下,很难知道确切的原因。
如上所述,您可以设置代码以捕获并重试有限次数。捕捉错误并不是一个坏主意。
根据xml的大小,另一种可能性是将其读入字符串缓冲区然后解析它。对于大数据,这可以降低重置的可能性,因为您的服务器连接将比您在解析时更短。我在这里想到一个场景,在你解析时tcp窗口关闭了很长时间,最终另一方决定你已经死了并重置连接。
答案 1 :(得分:0)
AssertionError
提供了一种标准方法来警告程序员所做的断言不正确。
因此,如果使用得当,他们会说"这里存在编码错误" (因为你将它们放在你声称不可缓存的地方),这就是为什么AssertionError
是(扩展)Error
而不是Exception
的原因:它们通知不可恢复的(在运行时)失败(因为你必须重新编码算法)。
此错误的其他用法是错误的,因为它们违反了合同。
所以,回答你的问题,你可以解决这个问题:
但你不应该在你的代码中处理它。
作为补充说明:您的案例让我怀疑
android.util.Xml.parse()
是否正确使用它。一个AssertionError
有一个原因(由另一个Throwable
构建)是非常奇怪的,所以这是另一个选择:可能这个库没有很好地实现......