4

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

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)
}

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

try{

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

        helper_handleError1(e)
} catch (CreateException e) {

        helper_handleError1(e)
}

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

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

4

8 回答 8

5

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

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

于 2008-12-04T14:43:42.030 回答
4

只要我们正在编造语法,我希望看到它是这样的:

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

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

于 2008-12-04T14:52:48.673 回答
0

我想是否可以对异常类型进行一些模式匹配作为语法附加。就像是

尝试 {
  ...
} 捕捉 ((IOException && !FileNotFoundException) || IllegalArgumentException ) {
  ... 处理它
}
于 2008-12-04T14:31:38.217 回答
0

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

于 2008-12-04T14:37:08.377 回答
0

试试这个:

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

(伪代码)

于 2008-12-04T14:37:26.833 回答
0

首先,

} 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);

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

你真的应该提供更多的细节。但是,在某些情况下它可能很有用(并不罕见)

于 2008-12-04T14:39:57.840 回答
0

另一种做法。

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

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();
}
于 2008-12-04T14:45:54.600 回答
0

为什么不只是

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;
}
于 2008-12-04T14:46:30.620 回答