Иногда вы хотите, чтобы скрыть детали реализации метода или улучшить уровень абстракции проблемы, так что это более значимым для вызывающей метода. Для этого вы можете перехватить исходное исключение и заменить обычным исключением, которое лучше подходит для объяснения проблемы.
Возьмем, например, метод, который загружает запрошенные данные пользователя из текстового файла. Метод предполагает, что текстовый файл существует с именем пользователя и суффикс «.data». Когда этот файл фактически не существует, не имеет смысла бросать исключение FileNotFoundException, потому что тот факт, что данные каждого пользователя хранятся в текстовом файле, является внутренней реализацией метода. Таким образом, этот метод может вместо этого обернуть исходное исключение в настраиваемое исключение с пояснительным сообщением.
В отличие от кода, который вы показываете, наилучшей практикой является то, что исходное исключение должно сохраняться, загружая его как свойство InnerException вашего нового исключения. Это означает, что разработчик может по-прежнему анализировать основную проблему, если это необходимо.
При создании пользовательских исключений, вот полезный контрольный список:
• Найдите хорошее имя, которое транспортирует почему было сгенерировано исключение, и убедитесь, что имя заканчивается словом «Exception».
• Убедитесь, что вы реализуете три стандартных конструктора исключений.
• Убедитесь, что вы отметили свое исключение атрибутом Serializable.
• Убедитесь, что вы выполняете конструктор десериализации.
• Добавьте любые настраиваемые свойства исключений, которые могут помочь разработчикам лучше понять и обработать ваше исключение.
• Если вы добавляете какие-либо пользовательские свойства, убедитесь, что вы реализуете и переопределяете GetObjectData для сериализации ваших пользовательских свойств.
• Если вы добавляете какие-либо пользовательские свойства, переопределите свойство Message, чтобы добавить свои свойства в стандартное сообщение об исключении.
• Не забудьте присоединить оригинальное исключение, используя свойство InnerException для вашего настраиваемого исключения.
Правильно ли я понял - нет необходимости обрабатывать исключение повторного броска? – chester89 2008-11-26 11:03:51
Что я имею в виду: если у вас есть кусок кода, который не может справиться с исключением (т. Е. Вы хотите, чтобы ваш вызывающий абонент обрабатывал его), у вас есть два варианта: 1. не поймайте его; 2. поймайте его, запишите его где-нибудь, а затем снимите. Перевернувшись, он появляется у вызывающего, как будто он никогда не был пойман. – 2008-11-27 05:04:22