2009-03-04 2 views
16

저는 RMI를 처음 사용하기 때문에 예외를 사용하는 것이 비교적 새롭습니다.RMI 및 예외

나는

내가 학생을 제공하는 간단한 서버를 (?이 가능하다) RMI를 통해 예외를 던질 수 있기를 원하고 나는 학생이 내가 원하는 존재하지 않는 경우 방법을 삭제해야 RemoteException을 확장하는 StudentNotFoundException의 사용자 정의 예외를 던집니다 (좋은 일 이니?)

모든 조언이나 조언을 부탁드립니다.

서버 인터페이스 방법

/** 
* Delete a student on the server 
* 
* @param id of the student 
* @throws RemoteException 
* @throws StudentNotFoundException when a student is not found in the system 
*/ 
void removeStudent(int id) throws RemoteException, StudentNotFoundException; 

서버 메소드 구현

@Override 
public void removeStudent(int id) throws RemoteException, StudentNotFoundException 
{ 
    Student student = studentList.remove(id); 

    if (student == null) 
    { 
     throw new StudentNotFoundException("Student with id:" + id + " not found in the system"); 
    } 
} 

클라이언트 방법

private void removeStudent(int id) throws RemoteException 
{ 
    try 
    { 
     server.removeStudent(id); 
     System.out.println("Removed student with id: " + id); 
    } 
    catch (StudentNotFoundException e) 
    { 
     System.out.println(e.getMessage()); 
    } 

} 

StudentNotFoundException

package studentserver.common; 

import java.rmi.RemoteException; 

public class StudentNotFoundException extends RemoteException 
{ 
    private static final long serialVersionUID = 1L; 

    public StudentNotFoundException(String message) 
    { 
     super(message); 
    } 
} 

답장을 보내 주셔서 감사합니다. 이제 문제를 해결하고 RemoteException을 확장하는 것이 좋지 않다는 것을 깨달았습니다.

답변

11

모든 종류의 예외 (사용자 정의 항목 포함)를 던져도 괜찮습니다. 수동으로 수행해야하는 Java 버전을 사용하는 경우 내보내기 .jar 파일에 패키지를 만들어야합니다.

나는 RemoteException을 서브 클래스 화하지 않을 것이다. 연결 문제가있는 경우 일반적으로 발생합니다. 아마도 클라이언트가 다른 유형의 문제와 다르게 연결 문제를 처리 할 것입니다. RemoteException을 catch하거나 다른 서버에 연결하면 서버가 다운되었음을 사용자에게 알릴 수 있습니다. StudentNotFoundException의 경우 사용자에게 학생 정보를 입력 할 수있는 또 다른 기회를 제공하려고합니다.

2

RemoteException까지 연장 할 예외는 없습니다.

은 (는 구체적인 예외 유형은 서버와 클라이언트 모두에서 사용하는 코드베이스에있을 필요가 던진 것을 주목할 가치가있다.)

5

네, RMI를 통해 예외를 던질 가능성이 있습니다.

아니요, 응용 프로그램 오류를보고하기 위해 RemoteException을 확장하는 것은 좋지 않습니다. RemoteException은 네트워크 장애와 같은 원격 메커니즘의 실패를 알립니다. 필요한 경우 java.lang.Exception까지 확장하여 적절한 예외를 사용하십시오.

자세한 내용은 look at another of my answers을 참조하십시오. 간단히 말해, RMI를 사용할 때 예외 체인에주의해야합니다.

+0

훗은, 그 질문은 잘 알고 보인다! –

+0

는 실제로 게시하기 전에이 바라 보았다. 조언을 건배 - 난 내가 문제가 – Malachi

2

나는 (이 가능합니까?) RMI를 통해 예외를 던질 수 있도록하려면

예. 아무 것도 예외없이 직렬화 할 수 있습니다. 나는 예외 자체가 Serializable을 구현한다고 생각한다.

나는 학생을 제공하는 간단한 서버를하고 난 학생이 내가 RemoteException을 확장 StudentNotFoundException의 사용자 지정 예외를 던져 싶어 존재하지 않는 경우 방법 삭제가 (이 할 수있는 좋은 일을?)

나는 개인적으로 예외를 확장 할 것이다. 귀하의 예외는 예외이며, RemoteExceptions으로는 연결 이유로 RMI와 잘못 될 일에 대한 것입니다.

+0

이제 해결 컴파일러가 먼저 잡았하는 가장 구체적인 예외를 필요있어 생각; 귀하의 예제는 컴파일되지 않습니다. 그렇지 않으면, 좋은 게시물. 그것을 젠장 –

+0

. 나는 그것을 알고 있었다! – banjollity