RMI и исключения - PullRequest
       13

RMI и исключения

17 голосов
/ 05 марта 2009

Я новичок в использовании 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());
    }

}

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 было плохой идеей.

Ответы [ 4 ]

12 голосов
/ 05 марта 2009

Можно создавать любые исключения (даже пользовательские), просто убедитесь, что они упакованы в ваш файл экспорта .jar (если вы используете версию Java, где вам нужно сделать это вручную). 1001 *

Я бы не стал создавать подкласс RemoteException. Они обычно выбрасываются, если есть какая-то проблема с подключением. Предположительно, ваш клиент будет решать проблемы с подключением не так, как другие типы проблем. Вы можете сказать пользователю, что сервер не работает, когда вы перехватываете RemoteException или подключаетесь к другому серверу. Для StudentNotFoundException вы, вероятно, захотите дать пользователю еще один шанс при вводе информации об ученике.

5 голосов
/ 05 марта 2009

Да, можно генерировать исключения через RMI.

Нет, не рекомендуется расширять RemoteException для сообщения о сбоях приложения. RemoteException сигнализирует о сбое в механизме удаленного взаимодействия, например о сбое сети. Используйте соответствующее исключение, расширяя java.lang.Exception самостоятельно, если необходимо.

Для более подробного объяснения посмотрите на другой мой ответ . В двух словах, будьте осторожны с цепочкой исключений при использовании RMI.

3 голосов
/ 05 марта 2009

Я хочу иметь возможность выдавать исключение через RMI (это возможно?)

Да. Все может быть сериализовано, даже исключения. Я думаю, что само Exception реализует Serializable.

У меня есть простой сервер, который обслуживает студентов, и у меня есть метод удаления, который, если студент не существует, я хочу вызвать специальное исключение StudentNotFoundException, которое расширяет RemoteException (это хорошо делать?)

Я бы лично продлил исключение. Ваши исключения являются вашими исключениями, а RemoteExceptions - для вещей, которые не работают с RMI по причинам подключения.

2 голосов
/ 05 марта 2009

Нет необходимости расширять ваши исключения RemoteException.

(Стоит отметить, что конкретные типы исключений должны быть в кодовых базах, используемых как сервером, так и клиентом.)

...