【问题标题】:Multiple Handling Exceptions in javajava中的多重处理异常
【发布时间】:2017-08-10 15:01:43
【问题描述】:

我需要处理一个特定的异常和其余的所有其他异常,这些异常应该给我们相同的日志信息,但日志的级别应该不同(前者应该是 log.warn,其余的应该是log.error)

        try {
        }
        catch (someexception e) {
         log.warn("some message")
         -----some code----
        }
        catch(AllotherExceptions e) {
        log.error("same message as above")
        -----same code as above----
        }

这需要最小化,因为消息是相同的,但需要将其余代码作为通用代码而不是多次编写

【问题讨论】:

  • 请举例说明。更好的是 - 向我们展示您迄今为止所做的工作,并说明您希望我们帮助您改进哪些方面。
  • 那么您想以不同的方式处理单独的异常吗?或者你想一次处理所有这些? @表情符号
  • 使用try{ ...} catch(MyFirstException mfe){} catch(MySecondException mse){}
  • 消息相同,但需要发送以使其余代码成为通用代码,而不是多次编写

标签: java logging exception-handling


【解决方案1】:

您有几种方法可以做到这一点。如前面的答案所示,您可以像这样制作连续的 catch 语句:

try {
    // Code that potentially throws multiple exceptions
}
catch (IOException ex) {
    // Manage this particular exception case
}
catch (Exception ex) {
    // Manage remaining exceptions
}

通过这种方式,您将能够管理特定案例并定义一个点来管理与以下操作相关的所有异常。通过将此try 语句放在您的流程的早期(主循环,繁重的服务调用......),您将管理许多异常,但您将无法管理特定情况,因为您不知道哪些特定操作抛出他们。通过封装一些特定的操作(访问文件、请求...),您将能够对这些异常进行非常具体的管理。

正如答案中所指出的,对于 Java >= 7,此语法将起作用:

try {
    // Code that potentially throws multiple exceptions
}
catch (IOException|SQLException ex) {
    // Manage these particular exceptions
}
catch (Exception ex) {
    // Manage remaining exceptions
}

当您需要以完全相同的方式管理不同的异常时,可以使用这种方式。当单个操作会引发不同的异常(即访问文件)但您只想特别管理一些特定的错误情况而不担心可能引发的所有问题时,它特别有用。

【讨论】:

  • 消息相同,但需要发送以使其余代码成为通用代码,而不是多次编写
  • 不确定我是否完全理解您愿意做什么,但也许我在回答中提出的管理异常的第二种方法是关键:只需抓住您认为是警告的每个异常另一个是每个错误
  • 您可以在帖子中查看修改后的代码。我需要一次性给出相同块的代码,而不是多次给出相同的代码
  • 我会检查异常名称,如果它在“警告级别”列表中,则针对这种情况执行您需要执行的操作。所以只有一个常规捕获,两个异常名称数组(一个用于错误,一个用于警告)和一个简单的发现来确定您所处的级别
【解决方案2】:

您可以使用多个catch 块来完成此操作,最后捕获所有已检查异常的基类Exception。例如:

try {
    // Your code here.
} catch (SpecificException e) {
    log.warn("Warning!", e);
} catch (AnotherSpecificException e) {
    log.warn("Another warning!", e);
} catch (Exception e) {
    log.error("Error!", e)
}

【讨论】:

    【解决方案3】:

    只需添加几个捕获部分并以全部捕获结束。

    try {
     // Some code
    }
    catch (IOException ex) {
         logger.log(ex);
         throw ex;
    catch (Exception ex) {
         logger.log(ex);
         throw ex;
    }
    

    在此处阅读更多信息:Documentation

    【讨论】:

      【解决方案4】:
      try{
      //try something
      } catch (SomeTypeException e){
      //things
      } catch (AnotherException e){
      //AnotherThings
      }
      

      【讨论】:

        【解决方案5】:

        以下示例在 Java SE 7 及更高版本中有效,消除了重复代码:

        try{
        
          }
          catch (IOException|SQLException ex) {
                logger.log(ex);
                throw ex;
            }
        

        【讨论】:

          【解决方案6】:

          从 java 7 开始,你可以做一个 try-Multicatch

              try {
                  new Foo("").doSomething();
              } catch (Exception1 | Exception2  e) {
                  e.printStackTrace();
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-16
            • 1970-01-01
            • 2015-09-11
            • 1970-01-01
            • 2012-02-11
            • 1970-01-01
            相关资源
            最近更新 更多