【问题标题】:Is there a way to override behavior of try catch and finally?有没有办法覆盖 try catch 和 finally 的行为?
【发布时间】:2013-09-21 06:13:32
【问题描述】:

到目前为止,我一直使用 try catch finally 作为异常处理机制,但我想制作一个通用的 finally 块来执行一些必要的操作。

在我的场景中,我必须在捕获任何 A、B、C 类异常后执行相同的操作。

问题是我不想在每个 try catch 块之后声明 finally 块。 这对我来说非常繁琐,因为我有将近 50 60 个类,其中许多都使用频繁的 try catch 块。

所以我要求一种更简单的方法来执行相同的操作。

有没有人为此找到捷径? 提前多谢。

【问题讨论】:

  • 没有捷径可走——如果你没有在 50-60 个课程中正确编写代码——你将不得不回去修复它!对不起兄弟。
  • 您可以做的一件事是在某种实用程序类中创建一个静态方法,将 finally 块的通用代码放在那里,然后在所有 finally 块中调用它。但是没有办法覆盖 finally 块,就像@alfasin 说你必须回去添加它。
  • 哦,亲爱的,那是一个可怕的消息,我希望是这个消息。当您在处理某人的代码时,这尤其困难。
  • 我不确定 Andriod,但您可以尝试使用 aspectj 之类的方法在方法结束时加入一些运行时功能。虽然不是初学者的话题。

标签: java android try-catch try-catch-finally finally


【解决方案1】:

您可以尝试在应用程序启动时使用javassist 检测您的类,然后类加载器加载您的类。

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class Main {

  private int run() {
    return new Test().myMethod();
  }

  public static void main( String[] args ) throws Exception {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.get( "Test" );
    CtMethod cm = cc.getDeclaredMethod( "myMethod" );
    // insertAfter(..., true) means this block will be executed as finally
    cm.insertAfter( "{ System.out.println(\"my generic finally clause\"); }", true );    
    // here we override Test class in current class loader
    cc.toClass();
    System.out.println( new Main().run() );
  }
} 


// another file (Test.java)
public class Test {
  int myMethod() {
    throw new RuntimeException();
  }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2023-03-18
    • 2012-03-06
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多