Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 06 2016 22:53:26
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Программирование на C#. Исключения (try-catch-finally)


[Назад] [Следующая страница]

5.3. Гарантированная постобработка

Часто, после некоторых операций существует необходимость выполнить определенные действия независимо от того, имели ли место ошибки в ходе выполнения этих операций или все закончилось успешно. К таким действиям относятся мероприятия по освобождения различного рода разделяемых ресурсов, таких как файлы или соединения с базой данных. Хотелось привести еще примеров, помимо этих двух банальных про файлы и соединения, но на ум ничего не приходит. Из своего опыта могу привести только соединение с сервером SAP-системы для удаленного вызова хранимых там процедур, но по мне так это мало чем отличается от работы с базой данных. Более подробное описание работы с файлами на C# будет приведено в конце этого раздела, а сейчас вернемся к серии отвлеченных примеров. Для размещения кода, освобождающего используемые разделяемые ресурсы используется блок finally, управление к которому переходит независимо от того, произошла ошибка или нет:

using System;
using System.Windows.Forms;
namespace CSharpQuickGuide
{
    public static class Sample03
    {
        public static void Test()
        {
            //Возбуждается исключение
            //"Object reference not set to an instance of an object"
            ExceptionSample(null);
            //Исключение не возбуждается
            ExceptionSample("not null");
        }
        //Метод, в котором может быть возбуждено исключение
        public static void ExceptionSample(object o)
        {
            try
            {
                //Если o==null, то ошибки не избежать
                MessageBox.Show(o.ToString());
            }
            catch (Exception ex)
            {
                //Вывод сообщения об ошибке
                MessageBox.Show(ex.Message, "Exception");
            }
            finally
            {
                //Этот код выполняется всегда! (почти всегда...)
                //Управление переходит к блоку finally независимо от того,
                //имела ли место исключительная ситуация или нет!
                MessageBox.Show("Finally");
            }
        }
    }
}

И даже в следующем примере код в блоке finally будет выполнен:

public static void ExceptionSample(object o)
   {
       try
       {
           MessageBox.Show(o.ToString());
           //Перед выполнением return мы все равно посетим блок finally
           return;
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message, "Exception");
           //И здесь нам не миновать блока finally
           return;
       }
       finally
       {
           MessageBox.Show("Finally");
       }
   }

И только приведенный ниже код заставляет программу не выполнять код блока finally:

public static void ExceptionSample(object o)
   {
       try
       {
           MessageBox.Show(o.ToString());
           //Эта команда сразу завершает выполнение программы с кодом 0!
           Environment.Exit(0);
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message, "Exception");
           //Завершаем выполнение программы с кодом 1!
           Environment.Exit(1);
       }
       finally
       {
           MessageBox.Show("Finally");
       }
   }

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

using System;
using System.Windows.Forms;
namespace CSharpQuickGuide
{
    public static class Sample04
    {
        public static void Test()
        {
            try
            {
                //Возбуждается исключение
                //"Object reference not set to an instance of an object"
                ExceptionSample(null);
                //Исключение не возбуждается
                ExceptionSample("not null");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Exception");
            }
        }
        public static void ExceptionSample(object o)
        {
            try
            {
                MessageBox.Show(o.ToString());
            }
            finally
            {
                MessageBox.Show("Finally");
            }
        }
    }
}

В этом примере последовательно выводятся сообщения “Finally” и “Object reference not set to an instance of an object”. До второго вызова ExceptionSample() дело не доходит, поскольку после первого вызова управление передается блоку catch метода Test().



[Назад] [Следующая страница]

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.