2011-08-19 1 views
2

아래 코드에서 throw를 중화하고 메서드를 계속 진행하려고 할 수 있습니까?AspectJ : 'throw'(로그로 대체)를 중화하고 메서드를 계속 수행 할 수 있습니까?

public class TestChild extends TestParent{ 

private String s; 

public void doit(String arg) throws Exception { 

    if(arg == null) { 
     Exception e = new Exception("exception"); 

     throw e; 
    } 
    s=arg; 
} 

}

최종 결과이어야, 즉 투사 E는 로그 (E)

  • S로 치환

    1. 트리거 예외의 경우 (ARG == NULL)에서 = arg가 실행 됨

    감사합니다.

    추신 : 나는 예외를 삼켜 버리거나 다른 예외로 대체 할 수 있습니다. 그러나 모든 경우에 그 방법은 계속되지 않습니다. 해가 이루어지면 내 모든 개입이 발생합니다 (예외가 발생했습니다).

  • 답변

    0

    일반 솔루션이 존재한다는 것을 강력히 의심합니다. 그러나 특정 코드 및 요구 사항 1과 2 :

    privileged public aspect SkipNullBlockAspect { 
    
    
    public pointcut needSkip(TestChild t1, String a1): execution(void TestChild.doit(String)) 
        && this(t1) && args(a1) ; 
    
    
    void around(TestChild t1, String a1): needSkip(t1, a1){    
        if(a1==null) //if argument is null - doing hack. 
        { 
         a1="";  //alter argument to skip if block. 
         proceed(t1, a1); 
    
         t1.s=null; 
         a1=null; //restore argument 
         System.out.println("Little hack."); 
        } 
        else 
         proceed(t1, a1);  
    
    } 
    

    }

    +0

    또는 try/catch로 진행할 수 있습니다. 조금 더 짧을거야. – alehro

    0

    나는 응용 프로그램이 그렇게 할 이유가 예외가 발생하기 때문에 경우에 일반적으로 당신이 원하는 것을 더 의미 대부분의 경우하지 않습니다 생각 그 이유는 거의 항상 가짜 데이터로 인해 발생할 수있는 후속 오류로 인해 예외가 throw 된 메소드의 정상적인 제어 흐름을 계속 수행하려는 의도가 이 아니며이 포함되어 있습니다.

    if(arg == null) 
        throw new Exception("exception"); 
    
    // We magically neutralise the exception and are here with arg == null 
    
    arg.someMethod();       // NullPointerException 
    double x = 11.0/Integer.parseInt(arg); // NumberFormatException 
    anotherMethod(arg);      // might throw exception if arg == null 
    

    당신이 내 포인트를받을 수 있나요 : 예를 들어, 당신은 이런 식으로 뭔가를 할 것입니다 코드에서 throw 및 코드의 다음 줄을 무엇을 중화 할 수 있다면? 당신은 제어 흐름을 계속함으로써 헤아릴 수없는 위험을 무릅 쓰고, 당신이 할 수 있다고 가정합니다. 이제 대안은 무엇입니까?

    • 우리가 당신 null의 값이 여기에 어떤 해를하지 않습니다 정확히 알고 가정하자. 그런 다음 after() throwing 조언을 통해 예외를 잡는 것이 가장 좋은 이유는 무엇입니까?
    • null이 해롭고 알고있는 경우 예외를 피하기 위해 메서드 실행을 가로 채고 매개 변수를 덮어 쓰지 않는 것이 좋습니다.
    • 메쏘드의 내용이 블랙 박스라고 가정하고 여기에 해킹하는 것을 시도하고 있다면 around() 조언을 사용하고 다른 값을 가진 proceed()을 여러 번 호출 할 수 있습니다 (예 : 일부 인증 토큰 또는 비밀번호) 호출 된 메서드가 더 이상 예외를 throw하지 않을 때까지.

    실제로 알 수 있듯이 문제가 무엇이고 달성하고자하는 바에 따라 실제 문제를 해결할 수있는 방법은 다양합니다.

    는 모든 일이 지금 우리가 초기 기술 질문를 잡는하지 의로 돌아 하게 말했지만, 실제로 즉 어떻게 든이 전혀 발생되는 피해, 예외 중화 가졌어요. AspectJ 언어에는 원하는 것을하기위한 기술적 수단이 포함되어 있지 않기 때문에 (감사합니다!)를 사용하면 Java 클래스 파일을보다 낮은 수준의 방식으로 조작 할 수있는 다른 도구를 볼 수 있습니다. 나는 그 (것)들을 결코 사용하지 않았다, 그러나 나는 당신이 BCEL 또는 Javassist를 사용하여 당신이 원하는 것을 할다는 것을 확실하다.