有没有办法在try {} catch块中打包所有类方法而不在每个方法中编写它?
在示例中我有那个类:
class Sample{
public void test(){
try{
...
}catch(){
//doing rollback
}
}
public void test2(){
try{
...
}catch(){
//doing rollback
}
}
}
我不想为每个方法编写try catch块。有没有办法将try..catch块提取到某些代码并在每个方法中“注入”它?
答案 0 :(得分:3)
如果您没有使用任何AOP框架,则可以使用Java Dynamic Proxy来调用类方法。在代理类调用期间,您可以处理异常(开始/结束事务等)。大多数AOP框架都是这样工作的。
答案 1 :(得分:2)
您可以将代码传递给处理异常的方法:
public void runTest(Runnable code) {
try {
code.run();
} catch(Exception e) {
//doing rollback
}
}
然后在每个test()方法中调用它:
public void test1() {
runTest(new Runnable {
//your code here
});
}
答案 2 :(得分:1)
我担心,无法在源级别这样做。但AOP要拯救 - 例如,看一下aspectj或任何其他AOP框架。
答案 3 :(得分:0)
取决于你在回滚内需要做什么,你可以使用try with resources添加到Java 7来编写你的代码。
但不确定这是否是您的用例。
基本上,如果我想要一个文件,请在异常的情况下关闭我的代码:
try(InputStream in = new FileInputStream(fileName)) {
//process data
...
}
原始代码:
InputStream in = new FileInputStream(fileName);
try {
//process data
...
} finally {
try{
in.close();
}catch(Exception e){
}
}
使用此方法,您只需要try块。
一个很好的参考是this。
答案 4 :(得分:0)
从您的评论中,您可以将您的应用程序与Spring集成。
然后,您可以使用spring transaction handling来处理数据库事务。
见这里: http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html
但它主要涉及在配置中定义数据源和事务管理器,然后使用@Transactional
答案 5 :(得分:0)
你可以这样做:
public static void main(String[] args){
Sample s= new Sample();
try{
s.test();
s.test2();
}
catch(Exception e){
}
}
class Sample{
public void test() throws Exception{
}
public void test2() throws Exception{
}
}
这是一个很好的做法,可以在main
之前捕获所有异常,除非您在特定methods
答案 6 :(得分:0)
您的方法可能会抛出不同的异常,rollback
也可能不同。所以可以将它们保存在单独的方法中
但是如果你这么说,所有的方法都是void
,那些方法抛出的异常也是一样的,回滚函数也是一样的,你可以这样做,我不知道是不是看起来更好:
class Sample{
public enum MethodFlag {Test1,Test2}
public void doStuff(MethodFlag flag){
try{
if (flag==MethodFlag.Test1)
test1();
if(flag==MethodFlag.Test2)
test2();
}catch(FooException ex){
rollback();
}
}
private void test1(){...}
private void test2(){...}
}
//calling it
Sample sample = new Sample();
sample.doStuff(Sample.MethodFlag.Test1);
没有在IDE中写,希望没有错字,只是表明了这个想法。