我想设计它,以便每当抛出一个自定义异常时,它会自动将堆栈跟踪打印到文件中。有没有我可以覆盖的方法来实现这个目标?这样做有助于减少项目中显着数量的代码。
答案 0 :(得分:3)
只要调用异常的构造函数,就可以使用堆栈跟踪。您无法对抛出的事件作出反应,但您可以在构造函数中编写堆栈跟踪。 如果你有一个共同的异常类,它是所有自定义异常的基础,那么你可以在它的构造函数中完成所有这些。
答案 1 :(得分:3)
您可以让自定义异常继承自RuntimeException,然后在相关主题上设置UncaughtExceptionHandler以查找异常并按照您的喜好处理它们。
答案 2 :(得分:1)
我可以覆盖一个方法来实现这个目标吗?
是的,printStacktrace()
方法。
您可以为异常创建基类,并调用可重新定向到您文件的“内部”打印。
您可以使用Logger
并让特定的记录器指向您想要的文件(并在需要时更改,禁用,重新启用等)
有些事情:
class MyStackTrace extends Throwable {
public void printStacktrace() {
super.printStracTrace();
internalPrint();
}
private void internalPrint() {
StringWriter sw = new StringWriter();
printStackTrace( sw );
Logger logger = Logger.getLogger("exceptions");
logger.warning( sw.toString() );
}
}
答案 3 :(得分:0)
当抛出异常时,我可以帮助您打印堆栈跟踪。但是在构造异常时很容易做到 - 只需在自定义异常的构造函数中包含printStackTrace()
。
答案 4 :(得分:0)
通常,登录每个异常创建都不是一个好主意。捕手应该真正决定什么是异常的最佳处理。同样覆盖异常中的方法并记录到文件会破坏围绕异常的常规合同。
另外,您可能会发现与后期登录相关的一些可怕的性能问题。如果在中心位置发生覆盖,你将很难解决这个问题。
如果您仍想在抛出异常时进行日志记录,那么更好的解决方案是使用/创建像Throwables这样的实用程序类。将代码调用为Throwables.logAndThrow(new CustomerException(...)),相同的一行代码,但长期灵活。 logAndThrow可以像使用前一张海报的记录器技术一样简单:
public static void logAndThrow(Throwable t){ logger.warning(T); 扔掉; }