Когда использовать, а когда не использовать Try Catch Наконец - PullRequest
12 голосов
/ 06 июля 2010

Я создаю веб-приложения asp.net в .net 3.5, и я хотел знать, когда использовать, а когда не использовать блоки Try Catch finally?В частности, большинство моих попыток улова заключаются в выполнении хранимых процедур и заполнении текстовых полей или видов сетки?Вы бы использовали Try Catch EVERYTIME , когда выполняете сохраненный процесс и заполняете элемент управления отображением данных?

Мой блок кода обычно выглядит так:

    protected void AddNewRecord()
    {
        try
        {
           //execute stored proc
           // populate grid view controls or textboxes
        }
        catch (Exception ex)
        {
           //display a messagebox to user that an error has occured
           //return
        }
        finally
        { }
   }

Ответы [ 7 ]

10 голосов
/ 06 июля 2010

Ответ «все зависит».

Возможно, вы захотите использовать try{...} catch {...} для каждой атомарной операции, чтобы в случае возникновения проблемы вы могли вернуться к последнему хорошему состоянию (используя транзакции).,Это может быть одна или несколько хранимых процедур - это зависит от вашего приложения.

Если вы перехватываете исключение, убедитесь, что вы явно указали, какие исключения вы перехватываете.У вас не должно быть catch (Exception ex) или catch() - известной как обработка исключений "catch all" - но вместо этого должны быть специальные операторы catch, такие как catch (IndexOutOfRangeException ex) (например).

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

4 голосов
/ 06 июля 2010

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

1 голос
/ 06 июля 2010

В дополнение к тому, что сказали другие, обязательно избегайте этого:

    try
    {
        throw new ApplicationException("Fake sql ex");
    }
    //catch and do nothing.  swallowing exceptions
    catch(Exception){ }                 
1 голос
/ 06 июля 2010

Как уже говорили другие, это зависит. Я склонен использовать блоки try / catch / finally в двух ситуациях:

  • Мне нужно обработать Исключение каким-то иным способом, кроме простого повторного его выброса.

  • Мне нужно очистить некоторые ресурсы в блоке finally.

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

0 голосов
/ 06 июля 2010

Используйте «try catch» в самом внутреннем цикле, который должен продолжать выполняться при возникновении определенного исключения.Помните, что если у вас есть цикл, который выполняется 10000 раз, и возникает исключение, например, в десятом повторении, которое не повлияет на другие 9 990, может быть полезно перехватить исключение и позволить циклу продолжать работу.С другой стороны, если исключение указывает на ошибку, которая предполагает, что 11-е, 12-е, 13-е и т. Д. Время прохождения цикла также приведет к сбою, было бы намного быстрее позволить исключению уничтожить цикл, чем продолжать повторную попытку операции.это не сработает.

0 голосов
/ 06 июля 2010

Что за Exception вы ожидаете от хранимого процесса?При условии, что вы не используете обработку исключений pokemon и точно знаете, что ожидается от вашего приложения, все, что не соответствует определенному Исключению, которое вы хотите перехватить, будет перехвачено объектом Application.

Другими словами, не используйте catch {} или catch (Exception), но специализированную обработку исключений:

catch(SqlException e)
{
   // Log stacktrace and show a friendly error to your user
}

В случае Application.Error происходит непредвиденное поведениедолжен быть обнаружен, и его легче отследить, чем просто попросить клиента вернуться к вам, сказав, что «в моих полях ничего не отображается».

0 голосов
/ 06 июля 2010

Большую часть времени вы не должны ловить исключения.В некоторых местах, где имеет смысл перехватить исключение, например,

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

Кроме того, оператор using block может использоваться для фактического вызова Dispose для объектов IDisposable, что устраняет необходимостьдля попытки ... наконец-то.

...