是否有使用以下两条关于例外的代码的最佳做法。
//code1
} catch (SomeException e) {
logger.error("Noinstance available!", e.getMessage());
}
//code2
} catch (SomeException e) {
logger.error("Noinstance available!", e);
}
我什么时候应该使用异常的getMessage方法?
答案 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()你需要覆盖并给出你自己的消息,即本地化消息的含义。