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不能在接口上声明已检查的异常。