抛出时自定义Java异常打印

时间:2009-12-17 18:23:58

标签: java exception override stack-trace

我想设计它,以便每当抛出一个自定义异常时,它会自动将堆栈跟踪打印到文件中。有没有我可以覆盖的方法来实现这个目标?这样做有助于减少项目中显着数量的代码。

5 个答案:

答案 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);       扔掉;     }