私はサーバーからXMLを引き出すAndroidアプリケーションを持っています。 XML.parse(...)が実行されたときJava AssertionError(java.lang.SocketException)の処理方法は?
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;
}
}
は時々、私は例外を取得:
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)
私は、このようなエラーを処理する方法は?
EDITキャッチエラーはプログラミングスタイルが悪いことを知っているので、私はより洗練された解決策を模索しています。
は、構文解析/フェッチを再試行してください:それは心の中で持っているもう一つの選択肢であるので、原因を持つ
AssertionError
が(別のThrowable
から構成されている)ことを非常に奇妙なのですか?基本的に例外は悪くないです、それは何かが間違っていることを示しています。だから、それをやり直す方法を考えてみてください(永遠に再試行しないでください!それを制限する再試行カウンタを作ってください)... – WarrenFaithエラーを捕まえるのは悪い考えです。これを行うには、キャッチ(Throwable)を書く必要がありますか? –
いいえ、そうではありません。 catch(AssertionError e)で十分です。 –