Обработка исключений C # - PullRequest
3 голосов
/ 12 июля 2011

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

private void Connect()
{
    try
    {
        // I will do something here
    }
    catch(Exception ex)
    {
        // If something bad happened
        // I want to ignore the problem and continue the execution
        // So, nothing will be placed in the catch block
    }
}

Заранее спасибо.

Ответы [ 5 ]

9 голосов
/ 12 июля 2011

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

4 голосов
/ 12 июля 2011

Это правильно, но пустые блоки catch являются таким анти-шаблоном, что этот блок комментариев находится на короткой стороне. Сделайте очень ясным, что это пусто специально.

И поскольку вы не используете его, пропустите часть (Exception ex).

1 голос
/ 12 июля 2011

Я не рекомендую пытаться игнорировать «catch» при обработке исключений. Вы должны сделать привычкой иметь дело с исключениями по мере их появления, это хорошая практика. Однако если вам нужна логика для продолжения выполнения, то вы всегда можете добавить блок «finally» и перейти от исключения.

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

Я бы посоветовал вам зарегистрировать исключение каким-либо образом. По крайней мере, вы получите точное чтение коэффициента отказов кода внутри блока «try». Это может помочь вам позже, если вы решите изменить код.

try
{
   //Code here
}
catch (Exception ex)
{
   //Exception handling here
}
finally
{
   //Finish, or continue, execution
}
1 голос
/ 12 июля 2011

Это абсолютно правильно в вашей функции, но может быть неправильным во всем контексте вашего приложения. Помните о нескольких вещах:

  1. Старайтесь никогда не ловить универсальный Exception
  2. Если вы хотите, чтобы это исключение накачивалось, вернитесь к вызывающей стороне, просто удалите блок try/catch.
  3. Если вы хотите повторно подключить исключение, обязательно вызовите throw ex, так как в этом случае вы не потеряете трассировку стека исключения.
  4. Если вы хотите, чтобы какое-либо действие было выполнено, всегда добавляйте finally или используйте тот же блок для освобождения ресурсов, которые вы выделили в try/catch, если они есть.

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

Надеюсь, это поможет.

0 голосов
/ 12 июля 2011

Таким образом, мы просто отбросили исключение. Смотрите комментарии для более подробной информации.

try
{
   // ... 
}
finally
{
  // ... 
}

Модульный тест, чтобы продемонстрировать это:

 [Test]
 public void ShouldRethrowExceptionWhenCatchBlockIsNotSpecified()
 {
     Assert.Throws<InvalidOperationException>(() =>
         {
             try
             {
                 Debug.WriteLine("1");
                 throw new InvalidOperationException("nothing");
             }
             finally
             {
                 Debug.WriteLine("3");
             }
         });
 }
...