dotSITE
Work in Murano Software. Учебник по C# Шаблоны проектирования
новости материалы решения форумы группы настройки/о проекте

Исключения

Мы не будем объяснять, зачем исключения в C#. Это не новое веяние. Это - стандарт. Искючения были придуманы уже больше 15 лет назад, стандартный синтаксис в них берет свое начало от C++.

Исключения служат для обработки ошибок. То есть, допустим, в некотором методе у вас случается ошибка. Что делать? Можно, конечно, прервать процесс без объяснений, но это не дело. К тому же метод, в котором возникла ошибка, ничего не знает об окружении , в котором он выполняется и, стаоло быть, не вполне компетентен в выборе стратегии в нештатной ситуации. Правильно было бы сообщить об этом "наверх", вызывающему методу. В языках без поддержки исключений использовались коды ошибок - метод (функция) завершался, возвращая "особенное" значение, которое трактовалось как ошибочное. Понятно, что такой подход являлся очень неудобным (сложно передать всю информацию об ошиюке в одном числе, сложность в выделении специальных значений).

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

Синтаксис довольно прост: в общем случае он выглядит следующим образом:

        try
        {
            блок команд, в котором может возникнуть ошибка
        }
        [catch [(тип_исключения имя_исключения)]
        {
            блок обработки исключения
        }]
        [finally
        {
            команды, которые выполняются в любом случае
        }]
    

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

Теперь о том, как создавать исключения. Делается это с помощью команды try, которой передается объект типа Exception, который содержит информацию об исключении. Таким образом, в блоке try исключения могут возникнуть двумя способами - непосредственный вызов команды throw или необработанное исключение в одном из вызываемых методов.

Приведем небольшой пример:

class ReverseFunction
{
    public static double Calculate( double f )
    {
        if (d == 0)
            throw new Exception("Function is undefined in 0");

        return 1 / d;
    }    

    public static void Main()
    {
        try
        {
            Console.WriteLine("1 / {0} = {1}", 2, Calculate(2));
            Console.WriteLine("1 / {0} = {1}", 0, Calculate(0));
            Console.WriteLine("1 / {0} = {1}", 1, Calculate(1));
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e);
        }
    }
}
    

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

try
{
    CalculateSpline();
}
catch (DivisionByZeroException e)
{
    Console.WriteLine("Divizion by 0");
}
catch (OverflowException e)
{
    Console.WriteLine("Overflow");
}
catch (Exception e) // Обработка остальных типов исключения
{
    Console.WriteLine("Exception: {0}", e);
}

<< Предыдущая Следующая >>

Контакт Реклама на сайте Спонсорам Веб мастерам

Лицензионное соглашение - © 2000-2012 dotSITE
Хостинг .NET предоставлен PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development