Порядок вылова оговорок - PullRequest
3 голосов
/ 19 июля 2009

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

Имеет ли значение, если вы пишете обработчики перехвата в этом порядке? Например. SqlConnection.Open () может выбросить:

System.InvalidOperationException System.Data.SqlClient.SqlException

Он указан в этом порядке. Должны ли мои обработчики поймать этот порядок? Если так, то почему?

Также некоторые методы, такие как SqlDataAdapter.Fill (), возвращают int, но Visual Studio не сообщает об ошибке, если у меня нет переменной для хранения возвращаемого значения. Почему?

Спасибо

Ответы [ 4 ]

9 голосов
/ 19 июля 2009

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

Среда выполнения будет проходить через блоки catch в порядке их перечисления, выполняя only первый соответствующий элемент, поэтому при наличии следующего будет выполняться только первый блок catch, даже если выдается ArgumentException:

try
{
  throw new ArgumentException("foo");
}
catch (Exception ex)
{
}
catch (ArgumentException aex)
{
  // Will never be executed.
}
5 голосов
/ 19 июля 2009

(Я согласен с Митчем, ловите в порядке приоритетности для ваших обстоятельств, поскольку это делает код более понятным.)

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

Например, если вы хотите перехватить System.Exceptions и System.InvalidOperationExceptions, вы должны сначала перехватить InvalidOperationException, поскольку он является подклассом System.Exception. Если у вас сначала есть перехват для System.Exception, который будет иметь приоритет, и ваш блок перехвата для InvalidOperationException никогда не сработает.

3 голосов
/ 19 июля 2009

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

Говоря, что если вы обращаетесь к базе данных SQL Server и получаете исключение SQL, маловероятно, что ваше приложение сможет продолжить работу, поэтому SqlException, вероятно, должно иметь высокий приоритет.

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

1 голос
/ 28 ноября 2012

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

Также вы можете заказать блоки захвата в соответствии с приоритетом или появлением наиболее вероятных ошибок в приложении

Если мы напишем неправильно

catch (Exception ex) {
    strMessage = ex.Message.ToString();
} catch (ArgumentNullException aex) {
    strMessage = aex.Message;
}

Компилятор сообщит об ошибке в приведенном выше случае, и ошибка будет следующей: предыдущее предложение catch уже перехватывает все исключения этого или супертипа System.Exception.

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