我是一个绿色开发人员,试图在大型多层java应用程序中处理错误处理(har-har)。在很多情况下,我认为通过多个层次链接异常是一个好主意;例如如果在最低层呼叫某些外部服务失败,则会在视图中一直出现问题:
最重要的例外,我真正想要检查的栈跟踪,是链中的最后一个;我提出了一个错误的请求,我需要修复foo的格式。但是,当我让这个异常在层中冒泡时,很好地链接在对每个层都有意义的异常中...当我最终捕获并记录该事物时,默认的日志记录行为总是向我显示关于最外层异常的详细信息,以及可能是根本原因的5行堆栈跟踪。
这使我想要在异常发生时记录它们,然后让它们冒泡,但最后你会记录大多数事情两次;什么时候发生,什么时候最终被抓住
这里的最佳做法是什么?
答案 0 :(得分:2)
我建议采用不同的异常管理方法。在应用程序的最顶层(如请求入口点)创建一个try catch块来调用任何运行时异常。你最好有2个catch块: - 针对您的应用特定(业务)例外 - 其余的(例外)
正如您所看到的,您需要向您介绍自己的异常类型,您将扩展该异常类型以创建用于不同目的的不同异常。例如,您可以为应用程序的每个层创建自定义异常,为每个集成等。使用未经检查的exeptions,因为它们都将在顶层处理。当任何特殊情况出现时(捕获低级异常),你应该: - 放置与业务上下文关联的描述(例如“无法从DB加载帐户数据” - 添加原始异常的描述(例如“原始错误:连接到DB失败”) - 将原始异常传递给您的异常,以免松散痕迹 - 扔掉和忘记。换句话说,顶级catch块负责适当地处理它(回滚事务,显示错误消息或您可能需要的任何其他内容)
答案 1 :(得分:1)
很好的问题,我很想知道你会得到的其他答案。
我倾向于采用“更多更好”的方法,并记录每一步。这会生成大型日志吗?是的,但是当您在大型Java应用程序中调试问题时,您会感谢您拥有的每个日志行。还有工具(至少是grep
,awk
,sed
三重奏)来帮助您过滤大文件。
另一种技术是编写此日志记录代码,但将其关闭(如果您使用的是log4j,则为TRACE
级别)。这样,如果遇到问题,您可能没有可用的日志,但这是一行更改(降低日志记录阈值),并且您开始生成大量数据以进行调试。
与之前的技术相结合,大多数日志库(我再次依靠我对log4j的了解)允许您调整不同Java包的日志级别。这意味着您可以将所有这些“捕获和重新抛出”日志行写为跟踪,并将较低级别包的日志记录调低为WARN
,同时将上层包保留为DEBUG
或{{1 }}