2009-12-17 126 views
0

我想要设计它,使得无论何时抛出我的自定义异常之一,它都会自动将堆栈跟踪打印到文件。有没有一种方法可以覆盖来实现这一点?这样做有助于减少我的项目中大量的代码。抛出时抛出自定义Java异常

回答

3

只要您调用异常的构造函数,stacktrace就可用。你不能对被抛出的事件作出反应,但你可以在你的构造函数中写入栈跟踪。 如果你有一个常见的异常类,它是所有自定义异常的基础,那么你可以在它的构造函数中完成所有这些。

+1

+1为细微差别。如果您急于实例化异常并且不总是抛出它们,或者将它们在与引发异常的位置不同的堆栈中实例化,则会导致问题。否则,这应该没问题。 – 2009-12-17 18:36:09

0

我可以帮助您在抛出异常时打印堆栈跟踪。但构建异常时很容易 - 只需在您的自定义异常的构造函数中包含printStackTrace()即可。

+0

这不需要管道stderr的文件? – 2009-12-17 18:33:32

+0

不。有一种方法exc.printStackTrace(PrintWriter pw)。你可以通过你喜欢的任何printwriter。 – 2009-12-17 18:40:36

3

你可以有你的自定义异常自RuntimeException继承,然后设置相关主题的UncaughtExceptionHandler寻找你的异常和你喜欢的处理它们。

+0

正如名称所述,UncaughtExceptionHandles仅捕获未被请求的异常。它不能取代放置好的捕捉块。 – tangens 2009-12-17 18:32:29

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()); 
    } 
} 
0

通常,登录每个异常创建都不是一个好主意。捕手应该真正决定什么是最好的处理例外。同样,重写异常中的方法并记录到文件中会打破异常的一般合同。

在附注中,您可能会发现与后期登录相关的一些可怕的性能问题。鉴于压倒一切发生在一个中央的地方,你将很难解决这个问题。

如果您仍然希望在抛出异常时进行日志记录,那么更好的解决方案是使用/创建一个像Throwables这样的实用程序类。将代码作为Throwables.logAndThrow(新的CustomerException(...))调用,同一行代码但长期灵活。 logAndThrow可能是一样简单,使用以前的海报的记录器技术:

公共静态无效logAndThrow(Throwable的吨){ logger.warning(T); throw t; }