[英]Java - Pack all class methods in try{ }catch block
有没有办法将所有类方法打包到try {} catch块中而不在每个方法中编写它?
例如,我有那个课:
class Sample{
public void test(){
try{
...
}catch(){
//doing rollback
}
}
public void test2(){
try{
...
}catch(){
//doing rollback
}
}
}
我不想为每种方法编写try catch块。 有什么方法可以将try..catch块提取到某些代码,然后在每种方法中“注入”它?
如果不使用任何AOP框架,则可以使用Java动态代理来调用类方法。 在代理类调用期间,您可以处理异常(开始/结束事务等)。大多数AOP框架都是这样工作的。
您可以将代码传递到处理异常的方法中,如下所示:
public void runTest(Runnable code) {
try {
code.run();
} catch(Exception e) {
//doing rollback
}
}
然后在每个test()方法中调用它:
public void test1() {
runTest(new Runnable {
//your code here
});
}
恐怕没有办法在源代码上做到这一点。 但是AOP可以帮助您-例如查看Aspectj或任何其他AOP框架。
根据回滚内需要执行的操作,可以使用带有Java 7中添加的资源功能的try来编写代码。
但是不确定这是否是您的用例。
基本上,如果我希望在发生异常的情况下关闭文件,我的代码将如下所示:
try(InputStream in = new FileInputStream(fileName)) {
//process data
...
}
原始代码为:
InputStream in = new FileInputStream(fileName);
try {
//process data
...
} finally {
try{
in.close();
}catch(Exception e){
}
}
使用这种方法,您只需要try块。
一个很好的参考, 这 。
从您的评论中,您可能会受益于将应用程序与Spring集成。
然后,您可以使用spring事务处理来处理数据库事务。
参见此处: http : //static.springsource.org/spring/docs/2.0.8/reference/transaction.html
但这实际上涉及到在配置中定义数据源和事务管理器,然后使用@Transactional
注释每个方法。
您可以这样:
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{
}
}
除非您在特定methods
需要它,否则最好捕获所有main
异常。
您的方法可能会引发不同的异常,并且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编写,希望没有错别字,只是展示这个想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.