Перехват исключений из нескольких методов внутри класса

В Java у меня есть класс с несколькими методами, которые вызывают одно и то же пользовательское исключение (пользовательское исключение расширяет класс «Исключение»):

private void setAColor(float r, float g, float b, float a) throws AnException {}
private void setBColor(float r, float g, float b, float a) throws AnException {}
private void setCColor(float r, float g, float b, float a) throws AnException {}

Вместо того, чтобы пользователь обрабатывал эти исключения, я хотел бы иметь возможность перехватывать их и обрабатывать внутри класса. Каждое исключение метода будет перехвачено точно таким же образом. Я не хочу помещать один и тот же блок метода try/catch в каждый отдельный метод. Есть ли способ поймать эти исключения вне тела методов, но внутри класса?

Спасибо за ваше время, даже если вы не можете мне помочь.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Эти методы могут вызываться до определенного момента: после вызова метода, который устанавливает для переменной "isImmutable" значение true, эти методы больше не смогут ничего изменить в объекте. Следовательно, если один из этих методов вызывается после того, как для параметра "isImmutable" установлено значение true, он должен генерировать исключение с именем "ImmutableException". Для /этой конкретной реализации/ я хочу иметь возможность обрабатывать их самостоятельно, вместо того, чтобы переходить к каждой точке кода, в которой вызываются эти методы, и обрабатывать их точно так же.


person Tanaki    schedule 09.10.2011    source источник
comment
Что сказал AVD, или дайте более подробную информацию о том, что вы пытаетесь сделать.   -  person Ryan Stewart    schedule 09.10.2011
comment
Я думаю, вы можете сделать это с помощью аннотаций, но я не знаю, как   -  person Cory Kendall    schedule 10.10.2011


Ответы (3)


Я не хочу помещать один и тот же блок метода try/catch в каждый отдельный метод.

Тогда не бросайте исключение.

Можно ли перехватывать эти исключения вне тела методов, но внутри класса?

No.

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

Это бессмысленно. Если обнаружена ошибка, как вы собираетесь сообщать о ней?

После вызова метода, который устанавливает для переменной "isImmutable" значение true, эти методы больше не смогут ничего изменить в объекте. Следовательно, если один из этих методов вызывается после того, как для параметра "isImmutable" задано значение true, он должен вызвать исключение с именем "ImmutableException".

Рассматривали ли вы возможность сделать ваше исключение подклассом RuntimeException? Тогда вызывающим объектам не нужно объявлять обработчики исключений - если нет обработчика, программа будет завершена из-за "необработанного исключения".

person Hot Licks    schedule 09.10.2011
comment
Наличие реализации RuntimeException в ImmutableException было именно тем, что мне нужно было сделать. Спасибо. - person Tanaki; 09.10.2011

Вы можете превратить вышеуказанные методы в методы-заглушки, которые вызывают

setColorDelagator(char abc, ...)

который делегирует

setColorAWithErrorHandling
setColorBWithErrorHandling
setColorCWithErrorHandling 

в попытке/поймать.

Я согласен, что это не оптимально, но я не уверен в лучшем способе.

person Cory Kendall    schedule 09.10.2011
comment
Я просто подумал об этом, имея COLOR_A, COLOR_B и т. д., где вам нужно было бы передать один из них в качестве аргумента. Но, учитывая способ настройки класса, гораздо более интуитивно понятно использовать решение, предложенное @Daniel. - person Tanaki; 09.10.2011

Чтобы подойти к этому с другой точки зрения, не думали ли вы о переходе на заводской шаблон? Вместо того, чтобы что-то вызывать для установки isImmutable в true, вызовите его, чтобы получить экземпляр, где isImmutable имеет значение true... и рассматриваемый метод возвращает другую версию класса, для которой нет доступных сеттеров.

person RHSeeger    schedule 09.10.2011