Как лучше обрабатывать исключения, чем следующие? - PullRequest
2 голосов
/ 31 мая 2011

Сначала я собирался сделать что-то вроде следующего:

public void WriteToFile(string filePath, string contents)
{
    try
    {
        File.WriteAllText(filePath, contents)
    }
    catch(Exception ex)
    {
        //Log error
    }
}

Но затем я решил перехватить все конкретные исключения для метода WriteAllText, например:

public void WriteToFile(string filePath, string contents)
{
    try
    {
        File.WriteAllText(filePath, contents);
    }
    catch (IOException ex)
    {
        //An I/O error occured when opening the file
    }
    catch (ArgumentException ex)
    {
       //The exception that is thrown when one of the arguments provided to a method   
         that is not valid.
    }
    catch (UnauthorizedAccessException ex)
    {
       //Unauthorized access
    }
    catch (SecurityException ex)
    {
        //Security exception
    }
    catch (NotSupportedException ex)
    {
        //Invoked method not supported
    } 
}

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

Я заметил некоторую путаницу.Я собираюсь обработать исключения, я оставил обработку исключения, чтобы сохранить это коротким.Я собираюсь использовать переменную ex.Вопрос больше в том, чтобы делать просто catch (Exception ex) или несколько операторов catch.

Я также говорю об этом, потому что всегда здесь говорю, что лучше обрабатывать конкретные исключения, а не catch-all.Если я неправильно понял это, уточните, что это значит.

Ответы [ 4 ]

2 голосов
/ 31 мая 2011

Это зависит от того, как вы обрабатываете исключение. Например, если SecurityException приведет к тому, что вы представите пользователю диалоговое окно для предоставления его учетных данных, тогда у вас должно быть отдельное предложение catch. В противном случае нет необходимости явно вызывать их всех.

* 1005 Е.Г. *

try
{
    File.WriteAllText(filePath, contents);
}
catch (SecurityException ex)
{
    //present dialog
}
catch (Exception ex)
{
    //All other exceptions handled the same
} 
1 голос
/ 31 мая 2011

Как правило, ваши операторы try / catch будут намного дальше от стека вызовов по сравнению с тем, что вы показываете в вопросе. Для этого есть две основные причины. Во-первых, низкоуровневый метод не будет знать, как обращаться с исключением, которое происходит внутри него, поскольку у него недостаточно контекста. Если низкоуровневый метод (например, тот, который сохраняет документ) действительно знает достаточно о своих обстоятельствах для обработки исключений, то это признак утечки абстракции. Во-вторых, выполнение программы на более высоких уровнях будет зависеть от того, успешно ли выполнена операция сохранения. По этим причинам все эти типы исключений лучше всего использовать на самых высоких уровнях, например на уровне пользовательского интерфейса.

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

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

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

0 голосов
/ 31 мая 2011

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

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

0 голосов
/ 31 мая 2011

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

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