Java 酷还是笨?捕获(异常[NamingException,CreateException]e)

Java 酷还是笨?捕获(异常[NamingException,CreateException]e),java,programming-languages,exception-handling,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();

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

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的stacktrace,并且我不想用第三个catch子句创建新的JMSException:)


有强人吗?这是一种只会污染Java语法的极端情况,还是一种很酷的添加方式?

我想知道是否有可能对异常类型进行一些模式匹配作为语法添加。差不多

try { ... } catch ((IOException && !FileNotFoundException) || IllegalArgumentException ) { ... handle it } 试一试{ ... }catch((IOException&!FileNotFoundException)| | IllegalArgumentException){ …处理它 } 我建议使用“执行周围”的习惯用法。

试试这个:

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

首先

} catch Exception[NamingException, CreateException] e) {
缺少“(”字符

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

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

void doYellow(NamingException e);
void doYellow(CreateException e);
(请注意,它们是不同的功能) 可以叫它吗


您确实应该提供进一步的细节。但是,在某些情况下(这并不罕见)

他们正在考虑为Java 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();
}
为什么不

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

只要我们在构建语法,我就希望看到:

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

类似于switch语句或使用块的C#
的故障。当然,变量e声明两次会有问题,但我认为可以解决一些问题。

它看起来像伪代码,但在转换为实代码时不太实用;(什么是“执行周围”习语?我认为这并不适合他的情况;他希望至少有一个异常能够逃逸并向上传播。阿维:问得好。格雷格:我在原始问题中没有看到这一点,我也不认为这是一个问题。有时候你可能不想这样做,原因有两个。1.它们可能没有相同的父异常。2.重新抛出class不能在接口上声明已检查的异常。