我想要设计它,使得无论何时抛出我的自定义异常之一,它都会自动将堆栈跟踪打印到文件。有没有一种方法可以覆盖来实现这一点?这样做有助于减少我的项目中大量的代码。抛出时抛出自定义Java异常
回答
只要您调用异常的构造函数,stacktrace就可用。你不能对被抛出的事件作出反应,但你可以在你的构造函数中写入栈跟踪。 如果你有一个常见的异常类,它是所有自定义异常的基础,那么你可以在它的构造函数中完成所有这些。
我可以帮助您在抛出异常时打印堆栈跟踪。但构建异常时很容易 - 只需在您的自定义异常的构造函数中包含printStackTrace()
即可。
这不需要管道stderr的文件? – 2009-12-17 18:33:32
不。有一种方法exc.printStackTrace(PrintWriter pw)。你可以通过你喜欢的任何printwriter。 – 2009-12-17 18:40:36
你可以有你的自定义异常自RuntimeException继承,然后设置相关主题的UncaughtExceptionHandler寻找你的异常和你喜欢的处理它们。
正如名称所述,UncaughtExceptionHandles仅捕获未被请求的异常。它不能取代放置好的捕捉块。 – tangens 2009-12-17 18:32:29
是否有我可以重写来实现这个方法?
是的,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());
}
}
通常,登录每个异常创建都不是一个好主意。捕手应该真正决定什么是最好的处理例外。同样,重写异常中的方法并记录到文件中会打破异常的一般合同。
在附注中,您可能会发现与后期登录相关的一些可怕的性能问题。鉴于压倒一切发生在一个中央的地方,你将很难解决这个问题。
如果您仍然希望在抛出异常时进行日志记录,那么更好的解决方案是使用/创建一个像Throwables这样的实用程序类。将代码作为Throwables.logAndThrow(新的CustomerException(...))调用,同一行代码但长期灵活。 logAndThrow可能是一样简单,使用以前的海报的记录器技术:
公共静态无效logAndThrow(Throwable的吨){ logger.warning(T); throw t; }
- 1. Java:抛出自身异常(?)
- 2. .NET抛出自定义异常
- 3. Kotlin - 抛出自定义异常
- 4. 魔术异常抛出抛出异常
- 5. Java:可以抛出异常抛出异常吗?
- 6. 从列表中抛出抛出异常时抛出IndexOutOfBoundsException:Java-> Kotlin
- 7. 抛出异常
- 8. 抛出异常
- 9. 抛出异常
- 10. 异常抛出
- 11. ReplaceAll java抛出异常
- 12. 在Java中抛出异常
- 13. Java抛出与SortedSet异常
- 14. java抛出异常java.lang.IndexOutOfBoundsException:
- 15. java:类抛出异常
- 16. java抛出检查异常?
- 17. Java不抛出异常
- 18. Java:异常抛出类?
- 19. 如何在Java中抛出自定义块异常
- 20. C#明确定义抛出的异常
- 21. XmlJavaTypeAdapter抛出用户定义的异常
- 22. 什么时候抛出java异常
- 23. BackgroundTaskCompletedEventArgs.CheckResult何时抛出异常?
- 24. 抛出异常时中断
- 25. 何时抛出异常?
- 26. 对象类抛出类抛出异常
- 27. 抛出或重新抛出异常?
- 28. 异常抛出异常
- 29. 膨胀自定义相对布局时类抛出异常? 15:
- 30. HttpURLConnection抛出异常
+1为细微差别。如果您急于实例化异常并且不总是抛出它们,或者将它们在与引发异常的位置不同的堆栈中实例化,则会导致问题。否则,这应该没问题。 – 2009-12-17 18:36:09