RemoteException을가 가에 예외를 나열하는 원격 방법을 필요로하는 예외를 확인하게하는 결정의 던졌습니다 절은 아니다 종교적인 것. 결정은 분산 컴퓨팅을 신뢰할 수있게 만드는 방법을 기반으로합니다. 이 질문은 사용자 목록에있는 동안 번에 한 번씩 나타납니다. 이전에 이라고 게시 한 자세한 응답이 있습니다. 여기에 관심이 있다면 입니다. rmi-users 보관함에서 찾을 수 없으므로 아래에 을 포함 시켰습니다.
는 차라리 의 RuntimeException보다, RemoteException을 체크 예외 만들기 에 대한 이론적 근거를 해결하고 싶습니다.
1) 네트워크는
나는 그들이 있다고 좋겠지 만, 사실, 들이 아니에요 신뢰할 수 없습니다. 모든 네트워크에는 일시적인 오류가 있습니다. 네트워크 리던던시를 구축 할 수 있지만 사실 대부분의 네트워크에는없는 입니다. 인터넷에는 과 같은 일시적인 오류가 있습니다. 따라서 모든 RPC는 이 실패 할 수 있습니다. 유형의 실패는 "네트워크"자체와 함께 을 수행 할 수 없습니다. 서버에 파일 설명자가 없으면 클라이언트에 예외가 발생합니다. 이것은 네트워크가 아닙니다 네트워크의 의미에서, 이 고장났습니다; 귀하의 서버는 자원의 일시적인 상태 인 에 있습니다.
RMI는 단일 시스템이 충돌 할 때 전체 네트워크 이 충돌하는 제한된 경우 만 처리하도록 설계되지 않았습니다. 그런 네트워크는 으로 신뢰할 수 있습니다. 모든 것이 올라 갔거나 모든 것이 다운되었습니다. 부분 오류가 없습니다. RMI는 좀 더 일반적인 잠재 고객 인 에 타겟팅됩니다.
실패 클라이언트에서 숨길 수 없습니다 2) RPC
부분 실패 의 사실 분산 프로그래밍입니다; 이 오류는 프로그램에 숨길 수 없습니다. 예외가 에 검사되었거나 검사되지 않은 예외인지 여부에 관계없이 클라이언트에 오류가 표시됩니다. 이 여전히 표시됩니다. 그렇다면 클라이언트에게 어떻게 그러한 오류 메시지를 표시해야합니까?
3) 예외가 더 강력한 프로그램 오크와 자바의 초기 버전 예외를 확인하지 않은 시간이 있었다
을 육성 확인. 예외 처리 이 권고 였고 거기에는 안전하지 않은 세계가있었습니다. 우리 그룹 (짐 Waldo와 나 : 특히) 는 컴파일러에 의해 검사 된 예외가있을 것을 권한다. 짐은 강력한 코드가 인 세계의 에게 말하면서 그의 주장에 설득력있는 꽤 이었다. 몇 가지 고려 사항을 수행 한 후에 Java 을 다시 검사하여 예외를 검사했습니다. 복구가 없었거나 응용 프로그램 오류가 반영된 에 대한 예외 만이 선택 해제되었습니다 (예 : )., OutOfMemoryError, 각각 NullPointerException). 그리고 세상은 다시 안전했습니다.
상상 자바 엔지니어 '자바 API 및 컴파일러에서 많은 예외가 체크에 체크되지 않은 변경되었으며, 컴파일러 이 구현에서, 그들은 발견 버그의 구분을 시행 놀라운 ! 따라서 오류를 처리하기위한 최선의 노력은 잘 의도되었지만 으로 충분하지 않았습니다. 즉, 컴파일러는 너무 궤도에 다시 여기에 체크 예외
확인을,해야
4) RemoteException을 :-) 뭔가 유용 입니다. RemoteException을가 RPC 호출에서 삶의 사실이기 때문에 (# 1 참조, # 2)가 예외 안전 코드를 작성하도록 강요 확인 (# 3), 우리는 는 RemoteException을 만드는 것은 확인이 끝난 예외 이을이라고 생각 좋은 생각. 강력한 분산 프로그램을 작성하는 것만으로도 컴파일러 없이도 을 예외없이 사용할 수 있습니다.
그래서 어떤 사람들은 RemoteException이 다음과 같다고 주장 할 수도 있습니다. OutOfMemoryError; 원격 호출에 실패 할 경우 프로그램이 죽을 것입니다. 이 점에 동의하지 않습니다. 예, 에서 일부 경우에는 에서 복구가 없습니다. RemoteException; 그러나 안정적인 분산 프로그램을 작성하는 경우 클라이언트는 실패를 감지하고 적절히 재 시도해야합니다. 다른 서버에 문의하거나 sort의 트랜잭션을 중단해야 할 수도 있습니다. RemoteException이 으로 처리되지 않으면 최대로 확산되고 은 클라이언트를 크래시합니다 (yuk).
기타 지역 경우에는 예외 거래 할 필요가 없습니다 지역의 경우 모두 원격 경우 클라이언트에서 사용되는 일부 원격 인터페이스가 있다는 것을 언급 그래서는 RemoteException는 안 은 throws 절에 있어야하고 처리는 필수가 아니어야합니다. 우리가 RemoteException을 생략하기 위해 원격 인터페이스를 방법을 허용 검사되지 않은 는 RemoteException를 슬로우 스텁 을 생성하는 "rmic의"스위치가 있다면 는 지금의 클라이언트는 문제 없음 선택의 여지가있다. 예외 처리 결정은 클라이언트 과 함께 남아 있어야합니다. 인터페이스를 정의하면 확인되지 않은 예외 만 throw됩니다. 은 예외를 처리 할 때 을 처리 할 때 클라이언트에게 도움이되는 클라이언트를 작성할 수 없습니다. 위의 예제에서 이미 을 보았습니다. 예외를 확인하면 강력한 코드가됩니다.
다시 지금 을 팝업하고있다 또 다른 문제
개발자는 단순히 로컬 인터페이스를 번역하고 원격 인터페이스로 사용 할 필요가 있다는 것입니다. 인터페이스가 을 배포에 사용하기 적합 하지 않을 수 동시성 및 부분 실패 염두에 통화 대기 시간, 인터페이스에 의해 캡처 된 프로토콜 으로 설계되지 않은 경우이 는 경우 작은 세트 일 수 있지만, 케이스. 충분한 정보가 에 전달되어 작전을 멱등 원로하게 만드나요? 아마도,하지만 가능성이 높습니다. 모든 에 RemoteException을 넣기
절은 고통, 하지만 강력한 분산 응용 프로그램을 작성하기위한 지불의 가격처럼 보일 수도있다 던졌습니다.
- 앤 Wollrath
명도 체크 된 예외의 개념이없는 언어에서 할 어떻게? 당신이 할 수있는 일은 다른 언어로 깨끗하게 할 수 없습니까? 문제는 실패가 정상적인 것을 깨닫지 않고 특별한 경우 인 "실패"를 고려하는 사람들입니다. 이러한 종류의 사람들은 예외를 확인하는 거대한 GOTO 문과 같습니다. 국가 시험 방법? 시간 초과? Naaaaah. 큰 거인 GOTOs * "sh! t가 팬에 부딪쳤다"*. 꽤 많은 Java 사양을 가지고 있으며, 전체 자바 커뮤니티를 재구성하지는 않습니다 (예 : Spring 프레임 워크는 큰 증오감을 가지고 있습니다). – SyntaxT3rr0r
Webinator, 그 남자가 아주 합리적인 질문을했습니다. 호언 장담 할 필요가 없습니다. – DJClayworth