2011-12-13 7 views
1

ServiceImpl에 의해 throw 된 PhoneNumberInUseException을 catch하는 코드를 만들려고하지만 아래 코드는 항상 else 문으로갑니다. 단순히 IllegalArgumentException를 사용할 수없는 이유GWT로 사용자 지정 예외 처리

@Override 
      public void onFailure(Throwable caught) { 
       Window.alert("Failed create account."); 
       if (caught instanceof PhoneNumberInUseException) { 
        Window.alert("Sorry, but the phone number is already used."); 
       } else { 
        Window.alert(caught.toString()); 
       } 

      } 

PhoneNumberInUseException extends RuntimeException

지금 난 그냥 그러나 나는 예외를 처리하기 위해 클라이언트 측 로직을하고있을 것이다,는 Window.alert 통해 보여주는하고, 즉이다 예외 문자열을 서버에서 클라이언트로 잘 전달합니다.

나는 뭔가를 놓친가요?

public class PhoneNumberInUseException extends RuntimeException { 

    public PhoneNumberInUseException() { 
     super(); 
    } 
} 

하고이 같은 서비스를 던지고있다 :

throw new PhoneNumberInUseException(); 

다음 코드가 제대로 발사한다 당신의 PhoneNumberInUseException 클래스는 다음과 같이 보입니다 경우

답변

0

나는 IllegalArgumentException 대신 단지 Exception에서 PhoneNumnberInUseException을 연장하고이 있지만 올바른 방법 인 경우가 Serializable, 나도 몰라했습니다 방금 여러분의 RPC 메쏘드가 그 예외를 던졌습니다 :`public void doSomething (Object someObject) throws PhoneNumberInUseException; GWT는 'throws'를 통해 명시 적으로 선언 된 경우에만 RuntimeException을 클라이언트에 전달합니다.
+0

현실적으로 당신은 그것을 정확히 코드를 유지 할 수 : –

+0

@ChrisCashwell RuntimeException을 사용하는 이유는 if-else 문 안에 예외를 던져야하기 때문입니다. 반면에 예외에서 확장하면 구문 오류가 발생합니다. – xybrek

+0

내 대답이 업데이트되었습니다. –

3

. 즉, 물론, 서비스를 가정하는 것은 그것과 같이 PhoneNumberInUseException 발생 것을 선언한다 :

public interface SomeService extends RemoteService { 
    void doSomething(Object someObject) throws PhoneNumberInUseException; 
} 

public interface SomeServiceAsync { 
    void doSomething(Object someObject, AsyncCallback callback); 
} 

public class SomeServiceImpl extends RemoteServiceServlet implements SomService { 
    public void doSomething(Object someObject) throws PhoneNumberInUseException { 
     if(somethingHappened) { 
      throw new PhoneNumberInUseException(); 
     } else { 
      doSomethingCool(); 
     } 
    } 
} 

당신이 제대로 작동해야합니다 있는지 모든 것을했습니다 후, 당신은에 중단 점을 넣어 할 수 있습니다 경우 라인

if (caught instanceof PhoneNumberInUseException) 

그리고 어떤 종류의 caught인지 알아 낸다. 이 아닌 경우PhoneNumberInUseException 일 경우 read the documentation이 아닐 것입니다. ,

public class PhoneNumnberInUseException extends IllegalArgumentException implements Serializable{ 
    public PhoneNumnberInUseException(){ 
     super(); 
    } 
    public PhoneNumnberInUseException(String msg) { 
     super(msg); 
    } 
}