For you, maybe t1 is more important than t2, but for someone else perhaps t2 is more important than t1. I don't know which solution is better, but right now, t1 is being logged and t2 is being thrown.
Hi list,
During my application development, I encountered some problems about the exception handling within SingleSessionCommandService class.
In this constructor
public SingleSessionCommandService(KnowledgeBase kbase,
KnowledgeSessionConfiguration conf,
Environment env) {
the exceptions are handled like this
try {
....
} catch ( Exception t1 ) {
try {
this.txm.rollback(); // line 1
} catch ( Throwable t2 ) {
throw new RuntimeException( "Could not commit session or rollback", t2 ); // line 2
}
throw new RuntimeException( "Could not commit session", t1 ); // line 3
}
In the first try block, if some exception occurred, exception t1 will be caught, then this.txm (TransactionManager) will be rolled back. But during this piece of code, if exception occurred again, throwable t2 will be caught, then t2 will be wrapped into another runtime exception and re-throw. In this case the wrapped t1 (in line 3) will never be throw out. But in my situation, the wrapped t1 exception will be more meaningful than the wrapped t2 exception.
So I think this code should be changed like this:
try {
...
} catch (Exception t1) {
try {
this.txm.rollback();
} catch (Throwable t2) {
logger.error(t2.getMessage(), t2); // or some other logs, but do NOT rethrow
}
throw new RuntimeException( "Could not commit session", t1
}
Is this right?
--
唐睿
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users