Если Вы реализуете IDisposable. Расположите () так, чтобы это никогда не бросало?

Spring

Этот пример относится к Spring 4, но вы также можете найти сканер классов в более ранних версиях.

// create scanner and disable default filters (that is the 'false' argument)
final ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
// add include filters which matches all the classes (or use your own)
provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));

// get matching classes defined in the package
final Set<BeanDefinition> classes = provider.findCandidateComponents("my.package.name");

// this is how you can load the class type from BeanDefinition instance
for (BeanDefinition bean: classes) {
    Class<?> clazz = Class.forName(bean.getBeanClassName());
    // ... do your magic with the class ...
}

Google Guava

Примечание. В версии 14 API по-прежнему отмечен как @Beta , поэтому будьте осторожны в производственном коде.

final ClassLoader loader = Thread.currentThread().getContextClassLoader();

for (final ClassPath.ClassInfo info : ClassPath.from(loader).getTopLevelClasses()) {
  if (info.getName().startsWith("my.package.")) {
    final Class<?> clazz = info.load();
    // do something with your clazz
  }
}
54
задан 23 February 2009 в 14:09
поделиться

5 ответов

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

См. здесь для большего количества мыслей об этом - включая идею метода обертки/расширения:

using(var foo = GetDodgyDisposableObject().Wrap()) {
   foo.BaseObject.SomeMethod();
   foo.BaseObject.SomeOtherMethod(); // etc
} // now exits properly even if Dispose() throws

, Конечно, Вы могли также сделать некоторую причуду, где Вы повторно бросаете составное исключение и с оригиналом и с секунда (Dispose()) исключение - но думаете: у Вас могли быть приблизительно using блоки... это быстро станет неуправляемым. В действительности исходным исключением является интересное.

17
ответ дан Marc Gravell 7 November 2019 в 18:07
поделиться

Руководство по проектированию Платформы (2 <глоток> без обозначения даты редактор) имеет это как (В§9.4.1):

ИЗБЕГАЮТ , выдача исключения из Располагает (bool) кроме под критическими ситуациями, где содержание процесса было повреждено (утечки, непоследовательное общее состояние, и т.д.).

Комментарий [Редактирование]:

  • существуют инструкции, не трудно управляет. И это - "ИЗБЕГАНИЕ" не, "НЕ ДЕЛАЮТ" инструкции. Как отмечено (в комментариях) Платформа повреждает это (и другой) инструкции в местах. Прием знает, когда повредить инструкцию. Это, во многих отношениях, является различием между Подмастерьем и Ведущим устройством.
  • , Если некоторая часть очистки могла бы перестать работать затем, должен предоставить Близкий метод, который выдаст исключения так, вызывающая сторона может обработать их.
  • , Если Вы следуете за расположить шаблоном (и необходимо быть то, если тип непосредственно содержит некоторый неуправляемый ресурс) затем эти Dispose(bool) может быть назван от финализатора, бросающий от финализатора плохая идея и заблокирует другие объекты от того, чтобы быть завершенным.

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

36
ответ дан Richard 7 November 2019 в 18:07
поделиться

Dispose должен быть разработан, чтобы сделать его цель, расположив объект. Эта задача безопасна и не выдает исключения большую часть времени . Если Вы видите, что себя выдаете исключения от Dispose, необходимо, вероятно, думать дважды, чтобы видеть, делаете ли Вы слишком много материала в нем. Около этого я думаю Dispose, должен рассматриваться как все другие методы: обработайте, если можно сделать что-то с ним, позвольте ему пузырь, если Вы не можете.

РЕДАКТИРОВАНИЕ: Для указанного примера я написал бы код так, чтобы мой код не вызывал исключение, но очистка TcpClient могла бы вызвать исключение, которое должно быть допустимым, чтобы распространить , по-моему (или обработать и повторно бросить как более универсальное исключение, точно так же, как любой метод):

public void Dispose() { 
   if (tcpClient != null)
     tcpClient.Close();
}

Однако точно так же, как любой метод, если Вы знаете tcpClient.Close(), мог бы выдать исключение, которое должно быть проигнорировано (не имеет значения), или должен быть представлен другим объектом исключения, Вы могли бы хотеть поймать его.

6
ответ дан Mehrdad Afshari 7 November 2019 в 18:07
поделиться

Я, вероятно, использовал бы вход для получения детали о первом исключении, затем позволил бы второму исключению быть повышенным.

1
ответ дан cjk 7 November 2019 в 18:07
поделиться

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

Однако, если я обнаруживаю внутри, Располагают то состояние программы, повреждается, лучше выдать исключение затем для глотания его, лучше для сокрушения теперь затем, чтобы продолжить работать и приводить к неправильным результатам.

2
ответ дан Nir 7 November 2019 в 18:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: