try catch在android中常用来处理java中出现的异常,这里我要介绍的是一个的是用它来debug java,特别是一些应用出问题,而从log里面有没有有用的信息的时候。
下面以我在debug某微盘程序微盘的apk为列:
现象,用这个应用程序上传大文件的时候出错,而且只有移动卡才有问题。一看这个现象可能都以为是移动网络的问题,但你看了device log 和tcpdump以后你会发现网络根本没有问题,而且每一次中断都是有client启动的。请看下面的log
05-0214:33:05.582 3603 3658 I global : call socket close inSocketHttpClientConnection,socket=Socket[address=/60.28.2.174,port=80,localPort=35051]
05-0214:33:05.582 3603 3658 I global : close connection by catchIOException when requestExec
从这里能判断出数据传输的终止是由上层app引起的,你要是把你的想法跟pm说他们肯定不同意,因为联通的卡是好的。所以问题就来了,怎么证明这个是app的问题呢? 也就是说要print出应用程序的call stack,在java里面一般有两种方法,说实话这里我两种都试过了,这里只是介绍怎么用try catch来触发。
从log看也就是,上层吧socket关掉了,我们也就从这里入手。
public void close() throws IOException {
int[] p;
if (!this.open) {
return;
}
this.open = false;
doFlush();
try {
try {
this.socket.shutdownOutput();
} catch (IOException ignore) {
}
try {
this.socket.shutdownInput();
} catch (IOException ignore) {
}
} catch (UnsupportedOperationException ignore) {
// if one isn't supported, the other one isn't either
}
Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection, socket="+this.socket.toString());
this.socket.close(); -》自然会想到这个函数加try catch,但是你会发现这个没有exception,每次都是正常关闭,怎么是关闭的时候抛出异常呢?
}
this.socket.close(); -》改为下面
try
{
if(this.socket.toString().contains("address=/60.28.2.225,port=80") ||this.socket.toString().contains("address=/60.28.2.174,port=80") )
{
p=new int[1];
//p[2] = 1; //remove it,it just for debug ,tigger crash
}
this.socket.close();
Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection again, socket="+this.socket.toString());
//the following try to make service crash.
this.socket.close();两次close socket确保会产生exception
}catch(IOException ex)
{
Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection->already closed before "+ ex);
throw ex;
}
}
这样的话exception就来了,你可以根据这里顺藤摸瓜,找出真正的问题。最后发现是微盘的问题。
vdisk.net.ComplexUploadInputStreamEntity.judgeTransfer 抛出异常导致http把socket关掉了,最后联系vendor一起把这个问题解决吧。
05-1011:08:10.999 2544 2863 I global : HttpRequestExecutor->execute:IOExceptionjava.io.IOException
05-1011:08:10.999 2544 2863 W System.err: java.io.IOException
05-1011:08:10.999 2544 2863 W System.err: atcom.vdisk.net.ComplexUploadInputStreamEntity.judgeTransfer(ComplexUploadInputStreamEntity.java:121)
05-1011:08:10.999 2544 2863 W System.err: atcom.vdisk.net.ComplexUploadInputStreamEntity.writeTo(ComplexUploadInputStreamEntity.java:74)
05-1011:08:10.999 2544 2863 W System.err: atcom.vdisk.net.ProgressListener$ProgressHttpEntity.writeTo(ProgressListener.java:62)
05-1011:08:10.999 2544 2863 W System.err: atorg.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97)
05-1011:08:10.999 2544 2863 W System.err: atorg.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:162)
05-1011:08:10.999 2544 2863 W System.err: atorg.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:278)
05-1011:08:11.019 2544 2863 W System.err: atorg.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:248)
05-1011:08:11.019 2544 2863 W System.err: atorg.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:122)
05-1011:08:11.019 2544 2863 W System.err: atorg.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:435)
05-1011:08:11.019 2544 2863 W System.err: atorg.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:593)
05-1011:08:11.019 2544 2863 W System.err: atorg.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:510)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.RESTUtility.execute(RESTUtility.java:625)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.VDiskAPI$ComplexUploadRequest.upload(VDiskAPI.java:1574)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.VDiskAPI.startComplexUpload(VDiskAPI.java:2592)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.VDiskAPI.putLargeFileRequest(VDiskAPI.java:2503)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.VDiskAPI.putLargeFileOverwriteRequest(VDiskAPI.java:2417)
05-1011:08:11.019 2544 2863 W System.err: atcom.sina.weipan.server.async.ComplexUploadAsyncTask.doInBackground(ComplexUploadAsyncTask.java:108)
05-1011:08:11.019 2544 2863 W System.err: atcom.sina.weipan.server.async.ComplexUploadAsyncTask.doInBackground(ComplexUploadAsyncTask.java:1)
05-1011:08:11.019 2544 2863 W System.err: atcom.vdisk.net.VdiskAsyncTask$2.call(VdiskAsyncTask.java:188)
05-1011:08:11.019 2544 2863 W System.err: atjava.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-1011:08:11.019 2544 2863 W System.err: atjava.util.concurrent.FutureTask.run(FutureTask.java:137)
05-1011:08:11.019 2544 2863 W System.err: atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-1011:08:11.019 2544 2863 W System.err: atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-1011:08:11.019 2544 2863 W System.err: atjava.lang.Thread.run(Thread.java:864)