Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка и описание исключений в библиотеки 
:(
    Опции темы
IRO
  Дата 21.9.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.2.2011
Где: Новосибирск

Репутация: нет
Всего: 1



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

Давайте рассмотрим надуманный пример:
Код

        /// <summary>
        /// Создаёт экземпляр класса <see cref="MyObject"/> на основе информации из файла.
        /// </summary>
        /// <param name="pathToFile">Путь к файлу, который содержит информацию об объекте.</param>
        /// <returns>Экземпляр класса <see cref="MyObject"/>, созданный на основе информации из файла.</returns>
        /// <exception cref="System.ArgumentException">Значение параметра <paramref name="pathToFile"/> равно <see langword="null"/> или имеет нулевую длину.</exception>
        /// <exception cref="System.FormatException">Неправильный формат данных файла.</exception>
        public MyObject CreateMyObjectFromFile(string pathToFile)
        {
            if (string.IsNullOrEmpty(pathToFile))
            {
                throw new ArgumentException(..., "pathToFile");
            }

            string fileContent;

            using (FileStream fStream = new FileStream(pathToFile, FileMode.Open))
            using (StreamReader sReader = new StreamReader(fStream))
            {
                fileContent = sReader.ReadToEnd();
            }

            // Проверяем правильность данных.
            if (...)
            {
                throw new FormatException(...);
            }

            // Вычисляем MD5 хэш-значение для одного из параметров объекта.
            using (HashAlgorithm hashProvider = new MD5CryptoServiceProvider())
            {
                StringBuilder hashBuilder = new StringBuilder();
                ...
            }

            // Создаём и возвращаем экземпляр класса.
            MyObject myObject = ...;

            return myObject;
        }


И так, данный метод может с генерировать два типа исключения. Если брать во внимание сторонние классы, то они могут с генерировать несколько типов исключений. Так вот, как поступить?

- Оставить как есть - это приемлемый вариант.
- Оставить как есть, но в XML-комментарии добавить все возможные исключения сторонних классов, просто скопировав их описание из документации.
- Сделать обёртку try-catch-finally над каждым потенциально-опасным вызовом. В catch сделать повторную генерацию исключения с пояснением ошибки и задать начальное исключение. В XML-комментариях указать все эти возможные исключения:
Код

        /// <summary>
        /// Создаёт экземпляр класса <see cref="MyObject"/> на основе информации из файла.
        /// </summary>
        /// <param name="pathToFile">Путь к файлу, который содержит информацию об объекте.</param>
        /// <returns>Экземпляр класса <see cref="MyObject"/>, созданный на основе информации из файла.</returns>
        /// <exception cref="System.ArgumentException">Значение параметра <paramref name="pathToFile"/> равно <see langword="null"/> или имеет нулевую длину.</exception>
        /// <exception cref="System.FormatException">Неправильный формат данных файла.</exception>
        /// <exception cref="System.Security.SecurityException">У вызывающего объекта отсутствует необходимое разрешение доступа к файлу.</exception>
        /// <exception cref="System.IO.IOException">Произошла ошибка ввода-вывода, при попытки считать данные файла.</exception>
        /// <exception cref="System.InvalidOperationException">Ошибка при вычисления MD5 хэш-значение, так как политика FIPS-совместимого алгоритма не задействована.</exception>
        public MyObject CreateMyObjectFromFile(string pathToFile)
        {
            if (string.IsNullOrEmpty(pathToFile))
            {
                throw new ArgumentException(..., "pathToFile");
            }

            string fileContent;
            FileStream fStream;
            StreamReader sReader;

            try
            {
                fStream = new FileStream(pathToFile, FileMode.Open);
                sReader = new StreamReader(fStream);

                fileContent = sReader.ReadToEnd();
            }
            catch (SecurityException ex)
            {
                throw new SecurityException("Не удалось получить доступ к файлу, который хранить информацию об объекте.", ex);
            }
            catch (IOException ex)
            {
                throw new IOException("Не удалось считать данные из файла, который хранить информацию об объекте.", ex);
            }
            finally
            {
                if (sReader != null)
                {
                    sReader.Dispose();
                }

                if (fStream != null)
                {
                    fStream.Dispose();
                }
            }

            // Проверяем правильность данных.
            if (...)
            {
                throw new FormatException(...);
            }

            HashAlgorithm hashProvider;

            try
            {
                // Вычисляем MD5 хэш-значение для одного из параметров объекта.
                hashProvider = new MD5CryptoServiceProvider();

                StringBuilder hashBuilder = new StringBuilder();
                ...
            }
            catch (InvalidOperationException ex)
            {
                throw new InvalidOperationException("Не удалось вычислить MD5 хэш-значение для одного из параметров объекта.", ex);
            }
            finally
            {
                if (hashProvider != null)
                {
                    hashProvider.Dispose();
                }
            }

            // Создаём и возвращаем экземпляр класса.
            MyObject myObject = ...;

            return myObject;
        }



Это сообщение отредактировал(а) IRO - 21.9.2011, 17:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.