酷还是傻? Catch(exception e)

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

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

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

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

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

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

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

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

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

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

尝试这个:

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

(伪代码)

首先,

 } catch Exception[NamingException, CreateException] e) { 

缺少’(’char。

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

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

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

(注意它们是不同的function)是否可以被调用?

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

另一种方法。

将低级exception转换为您自己的高级exception,并处理它。

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