Обработка исключений, когда переопределенный метод не генерирует никаких исключений - PullRequest
2 голосов
/ 06 октября 2011

Краткая форма: Как генерировать исключения (или делать аккуратную, чистую обработку исключений или, по крайней мере, принудительно останавливать выполнение), когда переопределенный метод не генерирует исключения?

Контекст: У нас есть лицензия на частное программное обеспечение, которое можно автоматизировать с помощью Java-макросов. Пользовательский макрос должен иметь следующую форму:

public class MyMacro extends SoftwareMacro {
    public void execute() {
        // user code goes here
    }
}

т.е. класс, который расширяет SoftwareMacro и имеет метод с именем execute, который переопределяет базовый класс 'execute. Содержимое этого переопределенного execute - это то, что ... хорошо ... выполняется, когда макрос "проигрывается".

Но переопределенный метод execute, по-видимому, не выдает никаких исключений.

execute() in com.mycompany.mypackage.MyMacro cannot implement execute() in 
somesoftware.base.SoftwareMacro
overridden method does not throw java.lang.Exception

Может быть, это наивно, но во время разработки я обычно хотел бы иметь соответствующий пузырь типа исключения до вершины и заставить выполнение останавливаться, чтобы я мог их увидеть и перейти к отладке. Это, очевидно, не вариант здесь.

Должен ли я вместо этого прибрасывать RuntimeException? (поскольку RuntimeException указывать не нужно) Это выглядит немного неаккуратно и является "нарушением в духе" противоречий метода базового класса.

P.S. Нет, я не могу изменить исходный код переопределенного метода execute.

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

Все зависит от того, что делает «Макроплеер», если он встречает исключение во время выполнения, и от того, что вы хотите, чтобы произошло.

Если он вообще не обрабатывает, но вы этого не делаетеосторожно, сгенерируйте исключение RuntimeException.

Если оно обрабатывает их правильно, сгенерируйте исключение RuntimeException.

Если оно не обрабатывает их должным образом, и вы не хотите, чтобы оно с треском провалилось, то перехватитеИсключения, которые могут возникнуть в вашем методе execute, и обрабатывать их так, как вы считаете наилучшим: показать диалоговое окно с ошибкой, вывести сообщение об ошибке, записать некоторую ошибку в журналы ...

4 голосов
/ 06 октября 2011

Похоже, что намерение состоит в том, что каждый SoftwareMacro выполняет всю свою собственную обработку ошибок. При необходимости используйте большой try вокруг всего вашего execute() метода, но не позволяйте исключениям исчезать. Выполните любую необходимую очистку внутри вашего метода execute и, возможно, напечатайте сообщение об ошибке для пользователя, если он предоставит способ сделать это.

Вы должны проверить все API, которые они предоставляют - возможно, есть средство для сообщения об ошибках, которое вы должны использовать.

1 голос
/ 06 октября 2011

«Должен» подразумевает, что есть правильный ответ, который IMO там не делает, что отвечает вашим потребностям.

Если система может допустить исключение времени выполнения и отвечает вашим потребностям, почему бы и нет?

Не то чтобы у вас был выбор, поскольку вы не можете выбросить проверенное исключение.

(Проверенные исключения кажутся мне неудачным экспериментом, хотя я понимаю мотивацию.)

0 голосов
/ 06 октября 2011

До тех пор, пока код execute не поглотит исключение, он все равно сгенерирует его, если он будет обнаружен.Если выбрасываются исключения типа RuntimeException или подклассы RuntimeException, их не нужно явно объявлять, главным образом потому, что компилятор не обеспечивает их объявление, поскольку (как следует из названия) они происходят только вво время выполнения и не может обязательно быть предсказанным во время компиляции.

Если, однако, метод execute, который, как вы сказали, вы не можете изменить, поглощает исключение и нене указывает на это исключение через запись в журнале, возвращаемое значение или что-то вроде RuntimeException Я думаю, вам не повезло.

Я бы согласился с Эрнестом в том, что, как представляется, цель состоит в том, что *Метод 1012 * выполняет всю собственную обработку исключений.

ПРИМЕЧАНИЕ. Переопределенные сигнатуры метода не обязательно должны точно совпадать, когда речь идет об исключениях, которые они выдают - только имя, тип возвращаемого значения, а также список и тип переменных..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...