Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Исключительная ситуация ( обработка ) | Блоки try catch finally

   Исключительная ситуация

Исключительные ситуации возникают очень часто. Если вы не можете моментально представить, что ж это за ситуации, то щас вам приведу примеры:

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

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

Для начала давайте рассмотрим пример работы исключений:

try
{
    Dictionary arr = new Dictionary();
    arr.Add(0, 10);
    arr.Add(4, 40);
    arr.Add(5, 50);
    Console.WriteLine(arr[6]);
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

У нас в нашем словаре Dictionary имеется 3 ключа: 0, 4, 5. И при попытке обратиться к любому несуществующему ключу (в нашем случае это ключ 6) будет возникать исключение. Для его обработки мы должны:

  1. поместить код в блок try, где по нашему мнению может возникнуть исключительная ситуация
  2. try{
       код;
    }

  3. далее, после блока try, пишем все варианты ошибочных ситуаций
  4. Сразу хочу отметить, что у каждого исключения есть свой код ошибки и, соответственно, название этой ситуации. В нашем примере возникает ошибка KeyNotFoundException (возникает, когда ключ не соответствует ни одному ключу в наборе).

    Но почему тогда в нашем примере мы используем исключение Exception, а не KeyNotFoundException. Дело в том, что Exception является общим исключением, которое будет перехватывать любую исключительную ситуацию.

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

    try
    {
        Dictionary arr = new Dictionary();
        arr.Add(0, 10);
        arr.Add(4, 40);
        arr.Add(5, 50);
        Console.WriteLine(arr[6]);
    }
    catch (KeyNotFoundException ex)
    {
        Console.WriteLine("Введен неверный ключ");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    Т.е. при возникновении исключения KeyNotFoundException. У нас сработает только catch (KeyNotFoundException ex). Если мы поменяем местами наши блоки catch, то обработается общее исключение, так как оно подходит под любую исключительную ситуацию, а основной обработчик именно этого случая останется нетронутым. Поэтому располагайте исключения в порядке от частного к общему.

   Блок finally

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

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

try
{
    // locationTextBox.Text - путь к файлу
    TextReader tr = new StreamReader(locationTextBox.Text);
    try
    {
        string str = tr.ReadToEnd();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        tr.Close();
    }
}

Рекомендации к прочтению:

  1. Консольный ввод / вывод
  2. Коллекции
  3. Регулярные выражения
При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru