java 捕获异常Exception 获取异常信息的方法 e.toString() e.getMessage() e.printStackTrace()
Java 异常中 e.getMessage() 和 e.toString() 和 e.printStackTrace()的区别
e.getMessage(): 打印 异常的原因
e.toString(): 打印 异常类型 和 异常的原因
e.printStackTrace(): 打印完整的异常堆栈信息
总结
e.getMessage() 和 e.toString() 方法: 打印的异常信息太少,没有具体的堆栈信息,不利于问题的定位处理!有时还会输出为 null 。头疼
e.printStackTrace :都可以打印完整的异常堆栈信息; 但 e.printStackTrace() 在遇到大量并发访问 且 出现异常时,会发生:内存被占满的情况,导致服务挂掉,不可用。
但项目实践中,是需要输出详细的错误,来判断问题出在哪里。
使用 org.slf4j.Logger 的 log.error() 多参数方法,来解决这个问题。
正确的记录错误异常日志的方法,应为:
log.error("发生错误! ", e.getMessage(), e);
以http请求为例,写下捕获异常的方法
使用多个 catch 来更好的定位 出错点
logger.debug("httpPost() 准备HttpPost请求! " + url + " " + ""); String result ="-1"; try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet("https://www.example.com"); CloseableHttpResponse response = httpclient.execute(httpget); try { HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity); EntityUtils.consume(entity); System.out.println(result); } finally { response.close(); } }catch (ClientProtocolException ex){ logger.error("httpGet() 请求失败 ClientProtocolException " + url + " ",ex.getMessage(),ex); }catch (IOException ex){ logger.error("httpGet() 请求失败 IOException " + url + " ",ex.getMessage(),ex); }catch (Exception ex){ logger.error("httpGet() 请求失败 Exception " + url + " ",ex.getMessage(),ex); } logger.debug("httpGet() 请求结果: " + result + " " + url);