Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 针对单个问题记录多个异常-如何处理?_Java_Logging_Exception Handling - Fatal编程技术网

Java 针对单个问题记录多个异常-如何处理?

Java 针对单个问题记录多个异常-如何处理?,java,logging,exception-handling,Java,Logging,Exception Handling,每个捕获点的捕获包和重新抛出模式以及日志记录都会导致日志中出现多个条目。你通常做什么?除非你认为这样做会增加一些价值,否则我不会抓住并包装。在这种情况下,您希望每个层都显示在日志中。任何你不想要的图层,不要放在那里 如果您无法控制包装,则可以取消包装并丢弃它们,或者容忍它们出现在日志中。在单个catch块中,要么处理(可能与日志记录一样简单)要么抛出(重新抛出异常,或包装异常并抛出新异常),决不能两者兼而有之 包装不是问题,因为如果查看堆栈跟踪,帧不会重复。原因仅包含包裹下方的框架。最好使用多种

每个捕获点的捕获包和重新抛出模式以及日志记录都会导致日志中出现多个条目。你通常做什么?

除非你认为这样做会增加一些价值,否则我不会抓住并包装。在这种情况下,您希望每个层都显示在日志中。任何你不想要的图层,不要放在那里


如果您无法控制包装,则可以取消包装并丢弃它们,或者容忍它们出现在日志中。

在单个catch块中,要么处理(可能与日志记录一样简单)要么抛出(重新抛出异常,或包装异常并抛出新异常),决不能两者兼而有之


包装不是问题,因为如果查看堆栈跟踪,帧不会重复。原因仅包含包裹下方的框架。

最好使用多种方法:

  • 尽量不要捕获每个异常,而是声明方法/构造函数来抛出这些异常,并从调用链的更高层代码捕获它们。除非您需要关闭资源(例如数据库句柄),否则捕获和重新抛出没有什么意义

  • 扩展您自己的异常类并将其他异常链接到其中。当您进行此操作时,请在Exception类中包含一个状态变量,以查看它是否已被记录


    • 检查过的异常通常不值得它们引起的麻烦

      我最喜欢的方法是将一个选中的异常打包成一个未选中的异常,让它自由运行

      也可以在每个方法中使用throws子句

      或者在较低级别捕获它,并实际处理它并将其作为错误代码返回


      处理异常的最好方法是永远不要生成异常。(例如,如果您试图打开一个可能存在或可能不存在的文件,而不是打开它然后创建它(如果打开失败),请测试它,必要时创建它,然后打开它并完全避免异常。

      任何单个异常都只应记录在一个位置,以避免阻塞日志。只要异常包含他最初的原因,你应该能够追溯到它

      我个人做了以下工作: 在我能捕获的最低级别捕获选中的异常,在RuntimeException(或子类)中包装一条最好的消息,以详细说明异常发生和重新抛出时发生的情况。在低级别不进行日志记录。在未选中(运行时)异常影响用户之前,在非常高的级别捕获未选中(运行时)异常。它在那里被记录(具有原始原因)并转换为对最终用户有用的消息


      这仅适用于无法处理的异常(这是最常见的)。还有其他情况,例如连接重试,但我不认为这是您问题的重点。

      我不捕获、包装和重新抛出。关闭资源可能应该在finally块中完成。回滚事务可能是在catch块中执行操作的更好示例。如何抛出包装异常并重新抛出抛出原始异常?您只能抛出一个异常。您将抛出一个新异常,该异常将旧异常包装起来。编辑我的帖子以使其更清晰。