C # - Try / Catch / Наконец и используя правильный порядок - PullRequest
0 голосов
/ 24 августа 2018

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

Если вы хотите перехватить исключение при создании объектов, вы должны поместить try и catch вне оператора using:

try { using... } catch (Exception e) { }

А если вы хотите перехватить исключение после создания объектов, то:

using(...) { try {...} catch (Exception e) {} }

Но что, если вы хотите поймать как во время, так и после создания объектов? Будет ли это:

try { using(...) { try {...} catch (Exception e) {} } } catch (Exception e) { }

Или лучше использовать попытку, поймать и, наконец, избавиться?

Ответы [ 4 ]

0 голосов
/ 24 августа 2018

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

{
    Font font1 = new Font("Arial", 10.0f);
    try
    {
        byte charset = font1.GdiCharSet;
    }
    finally
    {
        if (font1 != null)
            ((IDisposable)font1).Dispose();
    }
}

Это определение блока try-catch

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

Итак, стратегия зависит от вас.Этот фрагмент кода:

try
{
    using(Font font1 = new Font("Arial", 10.0f))
    {
        byte charset = font1.GdiCharSet;
    }
}

будет переведен как:

try
{
    Font font1 = new Font("Arial", 10.0f);
    try
    {
        byte charset = font1.GdiCharSet;
    }
    finally
    {
        if (font1 != null)
            ((IDisposable)font1).Dispose();
   }
}

Как видите, вы ловите исключения, вызванные конструктором, блоком, а также Dispose.

Принимая во внимание, что это:

using(Font font1 = new Font("Arial", 10.0f))
{
    try
    {
        byte charset = font1.GdiCharSet;
    }
}

будет переведено как:

Font font1 = new Font("Arial", 10.0f);
try
{
    try //This is your try
    {
      byte charset = font1.GdiCharSet;
    }
}
finally
{
    if (font1 != null)
        ((IDisposable)font1).Dispose();
}

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

0 голосов
/ 24 августа 2018

Вариант 1 будет использовать оба сценария:

try { using() } catch (Exception) {}

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

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

0 голосов
/ 24 августа 2018

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

try
{
    using(var con = DataService.GetSomethingDisposable()) // Possible InvalidOperationException();
    {
        // Do what you need here
        // Possible Exception here
    }
}
catch(InvalidOperationException ex)
{
    // Handle as you will
}
catch(Exception ex) // Catch any other exception
{
    // Handle as you will
}

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

0 голосов
/ 24 августа 2018

MSDN Reference https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

Когда время жизни объекта IDisposable ограничено одним методом, вы должны объявить и создать его экземпляр в операторе using.Оператор using вызывает метод Dispose для объекта правильным образом и (когда вы используете его, как показано ранее), он также заставляет сам объект выходить из области действия при вызове Dispose.В блоке using объект доступен только для чтения и не может быть изменен или переназначен.

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