RMI和异常

19

我刚开始使用RMI,并且对异常的使用也比较新。

我想要在RMI上抛出一个异常(这个可能吗?)

我有一个简单的服务器,提供学生信息,我有一个删除方法,如果学生不存在,我想抛出一个自定义的异常StudentNotFoundException,它扩展了RemoteException(这样做好吗?)

任何建议或指导将不胜感激。

服务器接口方法

    /**
 * 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());
    }

}

学生未找到异常

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是一个不好的想法。

4个回答

12

可以抛出任何类型的异常(包括自定义异常),但请确保将它们打包到您的导出 .jar 文件中(如果您使用的 Java 版本需要手动执行此操作)。

我不建议继承 RemoteException。这些通常是在出现某种连接问题时抛出的。假设您的客户端将以不同于其他类型问题的方式处理连接问题。当捕获到 RemoteException 时,您可能会告诉用户服务器已关闭,或连接到另一个服务器。对于 StudentNotFoundException,您可能想给用户另一次输入学生信息的机会。


6

是的,通过RMI抛出异常是可能的。

不,将RemoteException扩展以报告应用程序故障并不是一个好主意。 RemoteException表示远程调用机制中的失败,例如网络故障。如果需要,使用适当的异常,可以自己扩展java.lang.Exception

有关更详细的解释,请查看我的另一个答案。简而言之,在使用RMI时要小心链接异常。


呵呵,那个问题看起来很熟悉! - Tim Frey
在发布之前,我实际上已经查看过这个。感谢建议 - 我想现在问题已经解决了。 - Malachi

3
我希望能够通过RMI抛出异常(这是可能的吗?)
是的。任何东西都可以序列化,即使是异常。我认为Exception本身实现了Serializable接口。
我有一个简单的服务器用于提供学生信息,我有一个删除方法,如果学生不存在,我想抛出一个自定义异常StudentNotFoundException,该异常继承自RemoteException(这是一个好的做法吗?)
个人建议将其扩展为Exception。您的异常应该是您的异常,而RemoteExceptions是针对与RMI连接性相关的问题。

编译器要求首先捕获最具体的异常;否则,您的示例将无法编译。其他方面,文章不错。 - Tim Frey

2

您的异常类无需继承 RemoteException

(值得注意的是,抛出的具体异常类型需要在服务器和客户端都使用的代码库中。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接