java 捕获异常Exception 获取异常信息的方法 e.toString() e.getMessage() e.printStackTrace()

发布时间 2023-12-04 11:26:58作者: 海乐学习

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);
        }
logger.debug(
"httpGet() 请求结果: " + result + " " + url);