Два разных способа «ловить» два разных вида исключений в C #. Один лучше другого? - PullRequest
3 голосов
/ 21 июля 2011

Раньше мне никогда не приходилось ловить больше одного исключения. Но вот мой сценарий. Я хочу "попытаться" скопировать файл. Если пункт назначения не существует, я не хочу, чтобы это меня беспокоило. Но я все еще хочу поймать любой другой тип исключения. UnauthorizedAccessException, например. Ниже приведены две вещи, которые я пробовал, но я видел оба примера, используемые в Интернете. Является ли одно лучшее кодирование, чем другое. Или я совершенно неправ на обоих? Спасибо.

        catch (DirectoryNotFoundException)
        {
            // Do Nothing
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

или

        catch (Exception ex)
        {
            if (ex is DirectoryNotFoundException)
            {
                // Do nothing
                return;
            }
            else
            {
                MessageBox.Show(ex.Message);
            }
        }

Ответы [ 4 ]

5 голосов
/ 21 июля 2011

ИМХО, наличие нескольких перехватчиков снизит читабельность кода.Так что это то, что я хотел бы предложить.

if (Directory.Exists(dirPath))
        {
            try
            {
                File.Copy(sourceFile, destFile);
            }
            catch (Exception msg)
            {
                //Handle Exception.
            }
        }
4 голосов
/ 21 июля 2011

Первый вариант - лучшая форма, но на самом деле они оба работают одинаково хорошо.

Переходите к первому, он делает код чище

3 голосов
/ 21 июля 2011

Я бы пошел с первым по 3 причинам:

  1. Это читается лучше (IMO).
  2. Я был бы обеспокоен накладными расходами оператора ex is DirectorNotFoundExceptionво втором.
  3. Первый также будет легче изменить - что произойдет, если вам нужно перехватить исключение 3-го типа, или четвертое, или ...?

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

3 голосов
/ 21 июля 2011

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

catch (DirectoryNotFoundException)
{
    // Do Nothing
}

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

...