2013-09-16 4 views
0

До сих пор я использовал try catch, наконец, как механизм обработки исключений, но я хочу создать общий блок finally, который должен выполнить некоторые необходимые действия.Есть ли способ переопределить поведение try catch и, наконец?

Как и в моем сценарии, я должен выполнить одно и то же действие после обнаружения каких-либо исключений A, B, C.

Дело в том, что я не хочу объявлять окончательный блок после каждого блока catch try. Его очень утомительная процедура для меня, поскольку у меня есть почти 50 60 классов, и многие из них используют частые блоки catch catch.

, поэтому я прошу более простой способ выполнить одно и то же.

есть ли у кого есть путь для этого? Мое большое спасибо заранее.

+0

Нет ярлыков - если вы не правильно пишете свой код в классах 50-60, вам придется вернуться и исправить это! Прости, брат. – alfasin

+2

Одна вещь, которую вы можете сделать, это сделать статический метод в каком-либо классе утилиты, поместить свой общий код для блока finally, а затем вызвать его во всех блоках finally. Но нет возможности переопределить блок finally, например, @alfasin сказал, что вам нужно вернуться и добавить его. –

+0

О, моя дорогая, это ужасная новость, и я надеялся на нее. Особенно сложно, когда вы работаете над чьим-то кодом. –

ответ

0

При запуске приложения вы можете попытаться обработать свои классы с помощью 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(); 
    } 
} 
Смежные вопросы