酷还是傻? 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; }