문제

remoteexeptions를 던질 때 예외 체인을 사용하는 것이 나쁜 생각입니까? 우리는 다음과 같은 작업을 수행하는 RMI 서버가 있습니다.

public Object doSomething() throws RemoteException
{
    try
    {
        return getData();
    }
    catch (CustomException ex)
    {
        throw new RemoteException(ex);
    }
}

내 클라이언트의 ClassNotFoundException으로 인해 발생하지 않은 쉐어 플렉스를 받고 있습니다. 플러스 측면에서는 customexception 자체가 내보내는 것으로 밝혀졌습니다. 불행히도,이 사람 안에 깊은 또 다른 예외는 내보내지 않습니다. 이것은 classnotfoundException이 들어오는 곳입니다. 계층 구조는 다음과 같습니다.

remoteexception-> customexception-> sqlexection-> notExportedException

내가 보는 문제는 customexception이 수출되도록 보장 할 수 있지만 더 낮은 수준의 예외가 있음을 보장 할 수 없다는 것입니다.

나는 이것 때문에 Remoteexections와 함께 예외 체인을 사용하지 않는 것에 기대고 있습니다. 대신, 나는 아마도 서버쪽에 스택 추적을 기록하고 "원인"예외가없는 평범한 바닐라 원격을 던져야한다고 생각합니다. 전에이 상황을 다루어 본 사람이 있습니까?

도움이 되었습니까?

해결책

Remoteexception에서 customexception을 래핑하는 대신 다음과 같은 원격 인터페이스를 수정할 수 있습니다.

interface Foo extends Remote {

  Object doSomething() throws CustomException, RemoteException;

}

여기서 원칙은 RMI 런타임만이 리모티브 인식을 제기해야한다는 것입니다. 응용 프로그램 논리가 아닌 원격에서 약간의 실패를 나타냅니다. 실제로 콘크리트 구현은 RemoteException.

그러나 서비스가 제 3 자 라이브러리에서 예외를 포착하는 경우를 처리하지는 않지만 Throws 조항에이를 노출시키고 싶지 않습니다.

public Object doSomething() throws CustomException {
  try {
    return theirSvc.getData();
  } catch (ThirdPartyException ex) {
    throw new CustomException("Failed to obtain requested data.");
    // or: throw new CustomException("Failed to obtain requested data.", ex) ?
  }
}

이 경우 해당 타사 라이브러리에 대해 알 필요가없는 클라이언트에서 의존성이 생성되는 "누출 추상화"를 만들지 않는 것이 좋습니다.

일반적으로 로깅 그리고 동일한 오류가 반복적으로 기록되기 때문에 던지는 것은 나쁜 연습입니다. 그러나이 경우, 제외 된 예외가 고객에게 전송되기 때문에 정당하다고 생각합니다. 클라이언트와 서버에서 모두 로그인하는 것이 유용 할 수 있습니다. 캐치 블록은 다음과 같이 보입니다.

catch (ThirdPartyException ex) {
   String message = "Failed to obtain requested data.";
   log.error(message, ex);
   throw new CustomException(message);
 }

이러한 방식으로, ThirdPartyException 종속성은 서버로 제한되며 서버 로그에는 적절한 구현 별 정보가 포함되어 있으며 오류는 클라이언트에 올바르게보고됩니다.

다른 팁

소스 예외에서 메시지 + 전체 스택 추적을 캡처하고 원격 예외의 내용으로 전달했습니다. 이렇게하면 모든 스택 세부 사항을 얻을 수 있지만 직렬화 할 수없는 내부 예외 중 하나에 대해 걱정할 필요는 없습니다.

다른 제 3 자부 내부에 다른 물체가 무엇인지 알 수 없습니다 (또는 자신의 "First Party"사용자 지정 예외도!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top