抛出时自定义Java异常打印

抛出时自定义Java异常打印,java,exception,overriding,stack-trace,Java,Exception,Overriding,Stack Trace,我想将其设计为每当抛出一个自定义异常时,它都会自动将stacktrace打印到文件中。是否有一种方法可以替代以实现此目的?这样做将有助于减少我的项目中明显的代码量。只要调用异常的构造函数,stacktrace就可以使用。您不能对抛出的事件做出反应,但可以在构造函数中编写stacktrace。 如果您有一个公共异常类,它是所有自定义异常的基础,那么您可以在其构造函数中执行所有这些操作。当抛出异常时,我无法帮助您打印堆栈跟踪。但是构造异常时很容易做到——只需在自定义异常的构造函数中包含printSt

我想将其设计为每当抛出一个自定义异常时,它都会自动将stacktrace打印到文件中。是否有一种方法可以替代以实现此目的?这样做将有助于减少我的项目中明显的代码量。

只要调用异常的构造函数,stacktrace就可以使用。您不能对抛出的事件做出反应,但可以在构造函数中编写stacktrace。
如果您有一个公共异常类,它是所有自定义异常的基础,那么您可以在其构造函数中执行所有这些操作。

当抛出异常时,我无法帮助您打印堆栈跟踪。但是构造异常时很容易做到——只需在自定义异常的构造函数中包含
printStackTrace()

您可以让自定义异常从RuntimeException继承,然后在相关线程上设置,以查找异常并按自己喜欢的方式处理它们

是否有一种方法可以替代以实现此目的

是的,
printStacktrace()
方法

您可以为您的异常创建一个基类,它们调用一个“内部”打印,该打印将被重新定向到您的文件

您可以使用
记录器
,让特定记录器指向所需的文件(并在需要时更改、禁用、重新启用等)

大致如下:

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

一般来说,登录每个异常创建并不是一个好主意。捕获者应该真正决定什么是对异常的最佳处理。另外,在异常中重写该方法并将其记录到文件中也会打破围绕异常的一般约定

另一方面,您可能会在稍后阶段发现一些与日志记录相关的可怕性能问题。鉴于覆盖发生在中心位置,您将很难解决此问题

如果您仍然希望在抛出异常时进行日志记录,那么更好的解决方案是使用/创建一个类似Throwables的实用程序类。将代码称为Throwables.loganthrow(新的CustomerException(…)),这是同一行代码,但从长远来看是灵活的。LogAndRow可以简单到,使用前一张海报中的logger技术:

公共静态无效日志行(可丢弃的t){ 记录器。警告(t); 掷t; }


顾名思义,UncaughtExceptionHandles只捕获未捕获的异常。它不能代替放置良好的捕捉块。这不需要将stderr管道连接到文件中吗?不。有一个方法exc.printStackTrace(PrintWriter pw)。你可以通过任何你喜欢的printwriter。细微差别+1。如果您急切地实例化异常,但并不总是抛出它们,或者在抛出异常的不同堆栈中实例化它们,这将导致问题。否则,这应该没问题。