Зачем перебрасывать исключения?

(?!000000)[A-Z0-9][0-9]{5}, если lookahead в порядке.

35
задан Yaakov Ellis 22 September 2008 в 07:44
поделиться

12 ответов

Перебросок того же исключения полезен, если Вы хотите, скажем, зарегистрировать исключение, но не обработать его.

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

38
ответ дан Chris Jester-Young 22 September 2008 в 07:44
поделиться

На самом деле существует различие между

throw new CustomException(ex);

и

throw;

, второе сохранит данные стека.

, Но иногда Вы хотите сделать Исключение более "дружественным" по отношению к Вашему домену приложения, вместо того, чтобы позволить DatabaseException достигнуть Вашего GUI, Вы повысите свое пользовательское исключение, которое содержит исходное исключение.

, Например:

try
{

}
catch (SqlException ex)
{
    switch  (ex.Number) {
        case 17:
        case 4060:
        case 18456:
           throw new InvalidDatabaseConnectionException("The database does not exists or cannot be reached using the supplied connection settings.", ex);
        case 547:
            throw new CouldNotDeleteException("There is a another object still using this object, therefore it cannot be deleted.", ex);
        default:
            throw new UnexpectedDatabaseErrorException("There was an unexpected error from the database.", ex);
    } 
}
24
ответ дан Davy Landman 22 September 2008 в 07:44
поделиться
  • 1
    Так Вы don' t оптимизируют PNGs после этого? Просто ' save' с Photoshop создаст минимальный размер файла 49 КБ и меня don' t хотят это. – Kent Nguyen 15 March 2012 в 04:38

Иногда Вы хотите скрыть детали реализации метода или улучшить уровень абстракции проблемы так, чтобы it’s, более значимый для вызывающей стороны метода. Чтобы сделать это, можно прервать исходное исключение и заменить пользовательским исключением that’s лучше удовлетворенный для объяснения проблемы.

Берут, например, метод, который загружает требуемые детали user’s из текстового файла. Метод предполагает, что текстовый файл существует названный с user’s идентификатором и суффиксом “.data”. Когда тот файл doesn’t на самом деле существует, это, doesn’t имеют много смысла бросать FileNotFoundException, потому что то, что каждый user’s детали хранится в текстовом файле, является деталью реализации, внутренней к методу. Таким образом, этот метод мог вместо этого обернуть исходное исключение в пользовательское исключение с объяснительным сообщением.

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

при создании пользовательского исключения, вот полезный контрольный список:

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

• Гарантируют, чтобы Вы реализовали трех типичных конструкторов исключения.

• Гарантируют, чтобы Вы отметили свое исключение с сериализуемым атрибутом.

• Гарантируют, чтобы Вы реализовали конструктора десериализации.

• Добавляют любые пользовательские свойства исключения, которые могли бы помочь разработчикам понять и обработать Ваше исключение лучше.

•, Если Вы добавляете какие-либо пользовательские свойства, удостоверяются, что Вы реализуете и переопределяете GetObjectData для сериализации пользовательских свойств.

•, Если Вы добавляете какие-либо пользовательские свойства, переопределяют Свойство сообщения так, чтобы можно было добавить свойства к стандартному сообщению об исключении.

• Не забывают присоединять исходное исключение с помощью свойства InnerException пользовательского исключения.

10
ответ дан RoadWarrior 22 September 2008 в 07:44
поделиться
  • 1
    Это также работало на меня: Используя Pixelmator я экспортировал изображение как PNG, и это - все:) – nacho4d 15 March 2012 в 09:56

Вы обычно ловите и повторно бросаете по одной из двух причин, в зависимости от того, где код находится архитектурно в рамках приложения.

В ядре приложения Вы обычно ловите и повторно бросаете для перевода исключения во что-то более значимое. Например, если Вы пишете уровень доступа к данным и используете пользовательские коды ошибки с SQL Server, Вы могли бы перевести SqlException в вещи как ObjectNotFoundException. Это полезно, потому что (a) это облегчает для вызывающих сторон обрабатывать определенные типы исключения и (b) потому что это предотвращает детали реализации того слоя, такие как факт, Вы используете SQL Server для персистентности, просачивающейся в другие слои, который позволяет Вам изменять вещи в будущем более легко.

На границах приложений распространено поймать и повторно бросить, не переводя исключение так, чтобы можно было зарегистрировать детали его, помогая в отладке и диагностировании живых проблем. Идеально Вы хотите опубликовать ошибку где-нибудь, которую операционная команда может легко контролировать (например, журнал событий), а также где-нибудь который дает контекст вокруг, где исключение произошло в потоке управления для разработчиков (обычно прослеживающий).

9
ответ дан Greg Beech 22 September 2008 в 07:44
поделиться
  • 1
    Подтвердите фиксацию Pixelmator. Сохранение без любой специальной опции сделает. Оптимизация, которая сохранила образ, снова приведет к проблеме. – Kent Nguyen 16 March 2012 в 10:16

Я могу думать о следующих причинах:

  • Хранение набора зафиксированных типов вызванной исключительной ситуации, как часть API, так, чтобы вызывающие стороны только волновались о фиксированном наборе исключений. В Java Вы практически вынуждены сделать это из-за механизма контролируемых исключительных ситуаций.

  • Добавление некоторой контекстной информации к исключению. Например, вместо того, чтобы позволить пустой "записи, не найденной", проходят от DB, Вы могли бы хотеть поймать его и добавить "... при обработке порядка № XXX, поиске продукта YYY".

  • Выполнение некоторой очистки - заключительные файлы, откатывая транзакции, освобождая некоторые дескрипторы.

2
ответ дан Rafał Dowgird 22 September 2008 в 07:44
поделиться
  • 1
    Слова благодарности, это - конечно, ошибка, но по крайней мере я зафиксировал их теперь! – Chris 18 March 2012 в 00:14

Обычно "Делают Что-то", любой включает лучшее объяснение исключения (Например, обертывание его в другом исключении), или трассировка информации через определенный источник.

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

Нельзя сказать, что метод используется на чисто серьезных основаниях, много раз он используется, когда разработчик думает, прослеживая информацию, может быть необходим в некотором моменте в будущем, в этом случае Вы получаете попытку {} выгода {бросок;} стиль, который не полезен вообще.

1
ответ дан Guvante 22 September 2008 в 07:44
поделиться
  • 1
    I' m обнаружение с этим в 5,1 также и зарегистрированных rdar://11069678. Это, кажется, последняя строка пикселей в любой PNG8 или полутоновый файл PNG (в основном, любой файл PNG это can' t быть предварительно умноженным оптимизированный Apple' s pngcrush инструмент) – iccir 18 March 2012 в 23:38

К вашему сведению это - связанный вопрос о каждом типе переброска: Соображения Производительности для того, чтобы выдать исключения

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

1
ответ дан Community 22 September 2008 в 07:44
поделиться

Я думаю, что это зависит от того, что Вы пытаетесь сделать за исключением.

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

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

будет набор других причин сделать это все же.

1
ответ дан Jon Limjap 22 September 2008 в 07:44
поделиться
  • 1
    Я пытался сохранить PNG с и не оптимизируя от Photoshop, но обоих doesn' t работа. – Kent Nguyen 15 March 2012 в 04:36

Пока я не начал использовать EntLib ExceptionBlock, я использовал их для входа ошибок прежде, чем бросить их. Довольно противный, когда Вы думаете, что я, возможно, обработал их в той точке, но в то время, когда было лучше сделать, чтобы они перестали работать злобно в UAT (после входа их), а не покрыли поток - на ошибке.

0
ответ дан johnc 22 September 2008 в 07:44
поделиться

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

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

0
ответ дан Phil Wright 22 September 2008 в 07:44
поделиться
  • 1
    интересный. Когда я создаю FEDERATED Storage Engine, мне нужно к ' link' к базе данных, где данные на самом деле, правильно? в таком случае детали соединения сохраняются надежно в базе данных чей, создавая соединение? – user3262424 29 April 2011 в 16:38

ГЛАВНАЯ ПРИЧИНА повторно выдавания исключения состоит в том, чтобы оставить Стек вызовов нетронутым, таким образом, можно получить больше полного изображения того, что происходит и называет последовательность.

-3
ответ дан dimarzionist 22 September 2008 в 07:44
поделиться
  • 1
    это правильно, но если необходимо агрегировать некоторые данные для некоторого отчета - это - быстрое и грязное решение. – Anatolij 29 April 2011 в 13:58

Как упомянул Рафал, иногда это делается для преобразования проверенного исключения в непроверенное или в проверенное исключение, которое больше подходит для API. There is an example here:

http://radio-weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html

0
ответ дан 27 November 2019 в 06:45
поделиться
Другие вопросы по тегам:

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