我正在写一些代码,我注意到异常处理中的一个模式让我思考:
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的语法,或者只是添加一个很酷的东西吗?
答案 0 :(得分:5)
他们正在考虑为Java 7扩展此类型。
答案 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;
}