Какое исключение следует выдать при сбое построения кэша? - PullRequest
6 голосов
/ 18 мая 2011

У меня есть класс, который содержит кеш (Set), и кеш построен на экземплярах. Я запутался, какое исключение / ошибку я должен выдать, если сборка кеша не удалась (не удается подключиться к базе данных или какой-либо другой).

class Provider {

   public Provider() {
       buildCache();
   }

   private void buildCache() {
       try {
           this.cache = getDataFromDb();
       } catch (Exception ex) {
           throw new ???
       }          
   }
}

Мне приходит в голову одно исключение: ExceptionInInitializerError, но Javadoc говорит, что оно генерируется при инициализации статических членов.

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

Очевидно, что я могу создать свой собственный ErrorOnBuildingCache и выбросить его, но мне интересно, подходит ли какое-либо исключение из библиотеки Java этому обстоятельству.

Ответы [ 2 ]

9 голосов
/ 18 мая 2011

Если вы сомневаетесь в том, какое исключение должно быть выдано, то и пользователи вашего кода тоже. Поэтому определите свой собственный тип исключения (например, FailedToInitializeCacheException) и выбросьте его. Никакой двусмысленности таким образом.

IllegalStateException будет разумной резервной позицией, но вы никогда не должны использовать ExceptionInInitializerError (или что-то, заканчивающееся Error) - это низкоуровневый загрузчик классов, не связывайтесь с этим.

1 голос
/ 18 мая 2011

Очевидно, я могу создать свой собственный ErrorOnBuildingCache и бросить его, но Интересно, есть ли исключения в Java библиотека подходит для этого обстоятельства.

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

С другой стороны, вы не должны ловить исключение, исключаемое в очень специфических случаях. Ловля исключений будет перехватывать все, как исключения нулевого указателя, деление на ноль, ошибки ввода-вывода, исключение безопасности.

Что бы я сделал:

  • Укажите причину при отбрасывании исключение, чтобы лучше исследование
  • Перехват исключений, которые могут произойти из-за проблем ввода-вывода / сети, но связать их с правильной ошибкой сообщение. В вашем случае это исключения БД.
  • Не поймать исключение, которое связано для программирования ошибок (как ноль указатели), пусть они всплывают, чтобы вы непосредственно знать реальную причину ошибки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...