2013-07-26 3 views
1

내가올바른 도우미 메서드 예외가

class Chainable { 
    public Chainable doStuff(String test) { 
     return doSomething(test, true); 
    } 

    public Chainable doStuff(String test, String test2) { 
     String toUse = test + test2; 
     return doSomething(toUse, false); 
    } 

    private Chainable doSomething(String test, boolean version) { 
     // do something 
     if (somethingBadHappened) { 
      throw SpecialException.generate(); 
     } 

     return this; 
    } 
} 

SpecialException 같은 기능을 가지고 던지는 것은 사용자가 참조하도록되어 예외입니다. 예외 메시지에는이 예외를 던진 메소드가 의도적으로 포함되어 있습니다. 사용자는 doSomething("x")으로 전화를 걸고 실패하면 "Method 'doSomething' failed with the parameters: 'test = x | version = true'"이 표시됩니다.

그러나 사용자는 doSomething(String, boolean) 메서드와 매개 변수에 신경 쓰지 않습니다. 그는 doStuff(String)을 사용했으며 해당 기능에 대한 메시지를보고 싶어합니다.

은 그래서 내가 할 것은 :

새로운 예외의 원인으로 전자를 설정하고 올바르게 "Method 'doStuff' failed with the parameters: 'test = x'"가 (사용자가 스택 트레이스가 표시되지 않습니다 보여줍니다,하지만 난 디버깅해야 할 경우 내가 볼 수
public Chainable doStuff(String test) { 
    try { 
     return doSomething(test, true); 
    } catch (SpecialException e) { 
     throw SpecialException.generate(e); 
    } 
} 

정확히 무슨 일이 있었는지).

이제는 작동하지만 헬퍼 함수에 작업을 위임하는 새 함수를 작성할 때마다 스스로를 반복해야합니다. 문제는, SpecialException이 생성 된 위치에 따라 메서드 이름을 찾기 때문에 어떻게 도우미 함수를 사용해야하는지 잘 모르겠다. ...

더 좋은 방법이 있나요?

+0

두 번째 예외 생성을위한 e 매개 변수는 무엇입니까? – tbodt

+0

예외의 원인입니다. 예외가 발생하는 곳을 알아 내기 위해 디버깅해야하는 경우에 그냥 나를위한 것입니다. (예 : 예외 원인 = new Exception(); . –

답변

0

다음과 같이해야합니다. 스택 추적을 사용자에게 보여줍니다.

아무런 표시 방법에 대해 걱정할 필요없이 사용할 수 있습니다.

+0

사용자는 여러 가지 다른 인수를 사용하여 여러 가지 방법을 사용하며 자주 실패 할 것입니다. stacktrace를 통해 크롤링하면 시간이 낭비되고 원래의 인수가 표시되지 않으므로 시간이 낭비됩니다. 이것이이 정보가 메시지에 들어가야하는 이유입니다. –

0

지금까지 내가 볼 수있는 한, 알고있는 한 aspect-oriented programming 또는 AOP를 사용하여 처리하는 것이 좋은 상황 일 수 있습니다. 자바에서는 AspectJ을 사용할 수 있습니다.

"pointcut" - 코드 실행의 특정 순간 (예 : 메소드 호출)을 정의하는 것으로 시작합니다. 다음으로 "advice"을 쓰면, 포인트 컷이 부딪 칠 때해야 할 일이 있습니다. 이 두 코드를 "aspect"에 넣고 빌드하는 동안 바이트 코드에 weaven을 넣습니다. 이 경우

, 당신은 당신의 Chainable에 공개 메소드 호출을 차단 포인트 컷을해야하지만, 호출은 Chainable 내에서해서는 안 :

pointcut publicChainableMethod()  : target(Chainable) 
             && call(public * *(..)) 
pointcut firstPublicChainableMethod() : target(Chainable) 
             && call(* *(..)) 
             && !cflowbelow(publicChainableMethod()); 

첫 번째 포인트 컷가 어떤 전화를 정의 Chainable의 public 메서드이고 두 번째 pointcut은 Chainable, 내의 메서드 호출을 정의하고을 제외하고 첫 번째 pointcut의 제어 흐름에있는 동안 호출하면 안됩니다.

after() throwing (SpecialException e): firstPublicChainableMethod() { 
    throw SpecialException.generate(e); 
} 

면책 조항 : 내가 더 AOP 나 AspectJ의 전문가는 아니지만, 그래서이 방법이 작동하지 않을 수 있습니다 아웃의 그것과

다음, 당신은 당신을 위해 새로운 SpecialException를 생성하는 조언이 필요 -상자.