Использование исключений в коде ... C # File IO исключения - PullRequest
2 голосов
/ 22 февраля 2011

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

try 
{

File.Copy(src,dest);

}
catch(Exception ex)
{
  ShowMessageToUser(ex.Message); 
}

Это хорошая практика? Я подумал, что мы всегда должны использовать специализированные исключения и перехватывать их ... с другой стороны, я понимаю, что File.Copy может выдавать несколько различных исключений, и будет проблематично написать блок catch для каждого исключения. ..? Так что же делать в этом случае ... Существует ли набор файловых коллекций исключений, которые мы можем использовать для отлова?

Спасибо, любые комментарии приветствуются.

Ответы [ 5 ]

2 голосов
/ 22 февраля 2011

Как общая практика, я бы сказал, что это не очень хорошая практика.Лично я бы обрабатывал это с отдельными исключениями и обрабатывал только те исключения, с которыми вы можете обращаться правильно.

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

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

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

File.Copy может выдавать только 8 типов исключений - обработка каждого с сообщением - всего 32 строки кода - это на самом деле не так уж многоесли вы считаете, что во всех случаях конечному пользователю предоставляется четкое и значимое сообщение во всех случаях.

1 голос
/ 22 февраля 2011

IO, как правило, является болью по этой причине - есть много вещей, которые могут пойти не так. Для вас было бы лучше:

  • Сделайте все возможное, чтобы избежать исключений, проверив все параметры перед вызовом File.Copy. Помните, что в исключениях .Net могут возникнуть серьезные проблемы с производительностью из-за генерации трассировки стека.
  • Поймайте исключения, которые, как вы знаете, способны обрабатывать. Для некоторых исключений вы можете захотеть отобразить сообщение об ошибке и попросить пользователя ввести новый ввод.
  • Если вы не можете обработать исключение прямо здесь, не поймайте его! Глотание исключений является источником всего зла. Сообщение об ошибке только немного лучше, чем глотание исключений, и только запутает конечного пользователя.

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

0 голосов
/ 22 февраля 2011

Ваш пример очень прост для реализации, но вряд ли это лучшие практики. Как правило

  • Поймайте только те исключения, которые вам действительно интересны на данном этапе. Позвольте всему остальному пузыриться, чтобы быть обработанным в другом месте.
  • Вы также можете использовать суперклассы для перехвата определенной группы исключений.
  • Не не используйте исключения для вещей, которые не являются ошибками. Например, если пользователь указывает имя файла для копии, вы можете проверить заранее , если файл существует, вместо того, чтобы полагаться на исключение. Исключения составляют «исключительные обстоятельства», а не предсказуемые условия.
  • Однако, если вы взламываете быстрый скрипт, не стесняйтесь использовать исключение, как в вашем примере; -)
0 голосов
/ 22 февраля 2011

Да, это плохая практика, и вы должны использовать определенные исключения, а затем общие Exception уменьшить блок catch.

Если вы чувствуете, что их слишком много, вам следует по крайней мере создать блоки длянаиболее ожидаемый файл Specific Exception, а затем имеет обычный блок Exception catch

0 голосов
/ 22 февраля 2011

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

Но скажем, например, что вы хотели бы зарегистрировать исключение, если оно произошло из-за проблем безопасности ..Вы бы написали что-то вроде:

catch (PermissionDeniedException ex)
{
    Log(ex.foo);
    ShowMessageToUser(ex.Message); 
}
catch(Exception ex)
{
    ShowMessageToUser(ex.Message); 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...