Подтвердить что ты не робот

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

Я новичок в использовании RMI, и я относительно новичок в использовании исключений.

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

У меня есть простой сервер, который обслуживает студентов, и у меня есть метод delete, который, если ученик не существует, я хочу бросить специальное исключение из 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 было плохим.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Мне нужно было бы продлить Exception лично. Исключение составляют ваши исключения, а RemoteExceptions - это то, что неправильно с RMI по причинам подключения.