异常很常见,当抛出异常时,如果不能锁定问题出在哪,是令人非常头疼的问题,那么如果知道抛出的异常整个堆栈的详细信息,然后进一步的去分析会不会找到原因所在呢,在这里提供一个方式去打印出异常堆栈信息
ByteArrayOutputStream baos = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(baos)); String exception = baos.toString(); LogUtil.e("exception= "+exception);
其实解释起来很简单,说白了就是用文件流,等同于把e.printStackTrace()的内容打印到一个文件中,然后再把内容付给一个字符串,最后就可以把logger.error(exception)把错误内容打印到日志上了。
奉上实测图,交代一下背景:把图片上传到华为云,有的用户上传失败了,问题出在哪里不能够确认,这时借助异常的详细信息内容来确认问题就比较重要了。
exception= com.obs.services.exception.ObsException: Error message:OBS Error Message.OBS servcie Error Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the request time and the current time is too large.</Message><RequestId>10140000016730228BD5A775974AF6EC</RequestId><HostId>bb+U00D9WhC7Md7RxtnAB+4DilL7bI9I/Ym6thmXcnpIjyS9bo6OfXFkIVnTClGA</HostId><MaxAllowedSkewMilliseconds>900000</MaxAllowedSkewMilliseconds><RequestTime>Mon, 19 Nov 2018 08:00:29 GMT+00:00</RequestTime><ServerTime>2018-11-20T08:00:29.653Z</ServerTime></Error>
at com.obs.services.internal.utils.ConvertUtil.changeFromS3Exception(ConvertUtil.java:584)
at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:7306)
at com.obs.services.ObsClient.getBucketStorageInfo(ObsClient.java:2409)
at com.foton.repair.util.HuaWeiObjectStorageUtil.simpleUpload(HuaWeiObjectStorageUtil.java:157)
at com.foton.repair.util.HuaWeiObjectStorageUtil.startUploadMedia(HuaWeiObjectStorageUtil.java:91)
at com.foton.repair.util.HuaWeiObjectStorageUtil$1.onBackground(HuaWeiObjectStorageUtil.java:123)
at com.foton.repair.task.DispatchTask.doOnBackgroundListener(DispatchTask.java:174)
at com.foton.repair.task.DispatchTask.doInBackground(DispatchTask.java:80)
at com.foton.repair.task.DispatchTask.doInBackground(DispatchTask.java:29)
at com.foton.repair.task.BaseTask$2.call(BaseTask.java:203)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
从中分析就可以知道,是用户手机的当前时间和华为云的当前时间不一致造成的,问题也就确认了。
遇到此类问题的同学可以试一下。