打印异常与Exception.getMessage

时间:2015-09-29 09:25:05

标签: java exception

是否有使用以下两条关于例外的代码的最佳做法。

//code1

} catch (SomeException e) {
    logger.error("Noinstance available!", e.getMessage());
}

//code2
} catch (SomeException e) {
    logger.error("Noinstance available!", e);
}

我什么时候应该使用异常的getMessage方法?

6 个答案:

答案 0 :(得分:21)

第一个没有编译,因为方法error接受String作为第一个参数,Throwable作为第二个参数。

e.getMessage()不是Throwable

代码应为

} catch (SomeException e) {
    // No stack trace
    logger.error("Noinstance available! " + e.getMessage());
}

相比
} catch (SomeException e) {
    // Prints message and stack trace
    logger.error("Noinstance available!", e);
}

第一个只打印一条消息。第二个也打印整个堆栈跟踪。

如果需要打印堆栈跟踪,则取决于上下文。

如果您已经知道为什么可以抛出异常,那么打印整个堆栈跟踪并不是一个好主意。

如果您不知道,最好打印整个strack跟踪以轻松找到错误。

答案 1 :(得分:2)

当您将例外分类为业务级别技术例外时,此原型非常有用。

对于商家级别例外,您只需使用该消息,登录分析,或者可以在屏幕上显示含义信息(某些内容无效)。

对于技术异常,最好使用stacktrace记录错误,找出问题,并且很容易调试和解决。

答案 2 :(得分:1)

这取决于您是否需要原始异常的堆栈跟踪(SomeException)。如果是,那么code2在这里是正确的选项。请注意,这是处理这些情况的更常见方式。

如果您对原始异常不感兴趣,可以使用code1,但这个不正确。因为您发送的代码将消息作为参数。所以正确的方法是:

logger.error("Noinstance available! - reason:" + e.getMessage());

答案 3 :(得分:1)

使用stacktrace:

logger.error("Could not do XYZ because of: " + ex, ex);

没有stacktrace:

logger.error("Could not do XYZ because of: " + ex);

答案 4 :(得分:0)

除非您进行调试,否则不应使用

Exception.printStackTrace()

对于日志记录,最好使用Exception.getMessage()。另请注意,许多日志记录框架(例如Log4j)接受异常它作为日志记录方法的参数(例如error())并自行处理。

答案 5 :(得分:0)

你可以试试这个: -

logger.error(e.getMessage(), e);

返回此throwable的详细消息字符串。

logger.error(e.getLocalizedMessage(),e);

创建此throwable的本地化描述。子类可以重写此方法以生成特定于语言环境的消息。对于不重写此方法的子类,默认实现返回与getMessage()相同的结果。

在你的情况下,e只是异常的对象......

getLocalizedMessage()你需要覆盖并给出你自己的消息,即本地化消息的含义。