酷还是傻? Catch(异常[NamingException,CreateException] e)

时间:2008-12-04 14:23:33

标签: java programming-languages exception-handling

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

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的语法,或者只是添加一个很酷的东西吗?

8 个答案:

答案 0 :(得分:5)

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

请参阅:http://tech.puredanger.com/java7#catch

答案 1 :(得分:4)

只要我们编写语法,这就是我想看到它的方式:

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

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

答案 2 :(得分:0)

我想如果可以在异常类型上做一些模式匹配作为语法添加。像

这样的东西
try {
  ...
} catch ((IOException && !FileNotFoundException) || IllegalArgumentException ) {
  ... handle it
}

答案 3 :(得分:0)

我建议使用“执行”这个习惯用法。

答案 4 :(得分:0)

试试这个:

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

(伪代码)

答案 5 :(得分:0)

首先,

} catch Exception[NamingException, CreateException] e) {

缺少'('char。

排在第二位,为什么“Exception [NamingException,CreateException] e”而不只是“[NamingException,CreateException] e”?

这个想法可能很好,但它需要一些抛光。例如,假设我使用函数“doYellow()”声明“MyException”类,使用函数“doYellow()”声明“OtherException”类。是否允许这样的功能(考虑到超类中没有“doYellow()”函数)。如果是这样,如果只在其中一个上宣布“doYellow()”,是否允许?这是[]字符之前的“例外”是什么? 另外,假设有这个声明:

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

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

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

答案 6 :(得分: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();
}

答案 7 :(得分: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;
}