【问题标题】:Cool or Stupid? Catch(Exception[NamingException, CreateException] e)酷还是傻?捕获(异常[命名异常,创建异常] e)
【发布时间】:2008-12-04 14:23:32
【问题描述】:

我正在编写一些代码,我注意到异常处理中的一个模式让我思考:

try{

        // do stuff... throws JMS, Create and NamingException

} catch (NamingException e) {

        log1(e);
    rollback();
        doSomething(e)
} catch (CreateException e) {

        log1(e);
    rollback();
        doSomething(e)
}

JMSException 将处理堆栈中的某些位置。

是不是直接写:

try{

        // do stuff... throws JMS, Create and NamingException
} catch Exception[NamingException, CreateException] e) {

        log1(e);
    rollback();
        doSomething(e)
}

而不是把它放在一个辅助方法中:

try{

        // do stuff... throws JMS, Create and NamingException
} catch (NamingException e) {

        helper_handleError1(e)
} catch (CreateException e) {

        helper_handleError1(e)
}

请注意,我想传播原始 JMSException 的堆栈跟踪,并且我不“感觉”使用第三个 catch 子句创建新的 JMSException :)

有什么困难吗?这是一个只会污染 Java 语法的极端情况,还是只是一个很酷的东西?

【问题讨论】:

    标签: java programming-languages exception-handling


    【解决方案1】:

    他们正在考虑为 Java 7 扩展这种类型。

    见:http://tech.puredanger.com/java7#catch

    【讨论】:

      【解决方案2】:

      只要我们正在编造语法,这就是我希望看到的方式:

      try
      {
         // do stuff ...
      }
      catch (NamingException e)
      catch (CreateException e)
      {
         log1(e);
         rollback();
         doSoemthing(e);
      }
      

      类似于 switch 语句或 C# using 块的失败。当然,这里的变量 e 声明了两次是有问题的,但是我认为可以解决一些问题。

      【讨论】:

        【解决方案3】:

        我想是否可以对异常类型进行一些模式匹配作为句法附加。类似的东西

        尝试 { ... } catch ((IOException && !FileNotFoundException) || IllegalArgumentException ) { ... 处理它 }

        【讨论】:

          【解决方案4】:

          我建议使用“Execute Around”成语​​。

          【讨论】:

          • 什么是“Execute Around”成语​​?
          • 我认为这并不适合他的情况;他希望至少有一个异常能够逃脱并向上传播。
          • Greg:我在最初的问题中没有看到这一点,而且我也不认为这是一个问题。
          【解决方案5】:

          试试这个:

          try {
            ...
          } catch ( Exception e) {
            if typeof(e) not in ('MyException', 'SpecialException') {
              throw e
            }
            doSomething()
          }
          

          (伪代码)

          【讨论】:

          • 伪代码看起来不错,但转成真代码后就不太实用了;(
          【解决方案6】:

          首先,

          } catch Exception[NamingException, CreateException] e) {
          

          缺少一个 '(' 字符。

          其次,为什么是“Exception[NamingException, CreateException] e” 而不仅仅是“[NamingException, CreateException] e”?

          这个想法可能不错,但需要一些改进。例如,假设我用函数“doYellow()”声明“MyException”类,用函数“doYellow()”声明“OtherException”类。是否允许这样的功能(考虑到超类中没有“doYellow()”功能)。如果是这样,如果仅在其中一个上声明“doYellow()”,是否允许?这就是 [] 字符之前的“异常”吗? 另外,假设有这个声明:

          void doYellow(NamingException e);
          void doYellow(CreateException e);
          

          (注意它们是不同的功能) 会被允许调用吗?

          您确实应该提供更多详细信息。但是,在某些情况下它可能很有用(并不罕见)

          【讨论】:

            【解决方案7】:

            另一种方法。

            将低级异常转换为您自己的高级异常,并进行处理。

            try{
                try{
                    // do stuff... throws JMS, Create and NamingException
                } catch (NamingException e) {
                        throw new MyException(e);
                } catch (CreateException e) {
                        throw new MyException(e);
                }
            } catch (MyException e) {
                // something on e or e.getCause();
            }
            

            【讨论】:

              【解决方案8】:

              为什么不直接

              try
              {
                 // do stuff... throws JMS, Create and NamingException
              }  catch (JMSException e) 
              {   
                 if (e instanceof CreateException || e instanceof NamingExcption)
                 {    
                   log1(e);
                   rollback();
                   doSomething(e);
                 }
                 else
                   throw e;
              }
              

              【讨论】:

              • 有时您可能不想这样做有两个原因。 1.它们可能没有相同的共同父异常。 2.重新抛出的类可能不是接口上声明的检查异常。
              猜你喜欢
              • 1970-01-01
              • 2014-08-26
              • 2012-11-10
              • 1970-01-01
              • 2013-06-24
              • 2021-08-20
              • 2013-07-07
              • 1970-01-01
              相关资源
              最近更新 更多