progs.biz  
Начало>C#>Windows>Урок 2
C#
VB.NET
Visual C++.NET
Visual C++ 6
WinAPI
C++
Delphi
C++ Builder
Java
PHP
Visual Basic 6.0
DirectX
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

С. Робинсон и др C# для профессионалов.
С. Робинсон и др C# для профессионалов.
Заказать на Озоне


SpyLOG
Яндекс-цитирования

C# для Windows
Урок 2. Перехватываем ошибки

На прошлом уроке мы с вами написали первую программу для Windows на C#. У нее было много недостатков, в частности, не была предусмотрена ситуация, когда пользователь попытается разделить на ноль. Также не было предусмотрено, если пользователь вообще попытается ввести не число, а, скажем, буквы.

Вот этим мы сейчас и займемся.

Для обработки ошибок в C# предусмотрен так называемый механизм исключений. Самое важное, что пока надо понять - это то, что исключения являются экземплярами классов. Все классы для исключений являются потомками класса System.Exception (либо класс исключения совпадает с самим классом System.Exception).

Раз исключения - это классы, то у них есть методы и свойства.

Исключения бывают как предопределенные (т. е. соответствующие классы уже существуют в системе .NET-классов), так и заданные программистом (в этом случае программист должен объявить собственные, производные от System.Exception классы).

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

        private void button1_Click(object sender, System.EventArgs e)
        {
            int result=0;
            // Пытаемся произвести деление.
            try
            {
                result = 
                    Convert.ToInt32(textBox1.Text)/Convert.ToInt32(textBox2.Text);
                label1.Text=result.ToString();
            }
            // Обрабатываем деление на ноль.
            catch(DivideByZeroException ex)
            {
                label1.Text = ex.Message;
            }
            // Обрабатываем отальные ошибки.
            catch
            {
                label1.Text = "Неизвестная ошибка!";
            }
        }

Как вы видите, мы заключаем потенциально опасную операцию в блок try:

            // Пытаемся произвести деление.
            try
            {
                ...
            }

Заключение в такой блок означает, что возникшую в нем ошибку мы сможем ниже обработать.

После блока try может идти один или несколько блоков catch. Каждый catch обслуживает свой вид исключения, которое указывается в скобках после catch. Если после catch в круглых скобках ничего не указать, то это будет обработчик по умолчанию (т. е. если исключение не было обработано одним из предыдущих обработчиков, то оно обработается тут). У нас обработчиков catch два - у первого параметром идет исключение деления на ноль, второй обрабчик - это обработчик по умолчанию:

            // Обрабатываем деление на ноль.
            catch(DivideByZeroException ex)
            {
                label1.Text = ex.Message;
            }
            // Обрабатываем остальные ошибки.
            catch
            {
                label1.Text = "Неизвестная ошибка!";
            }

Обратите внимание, что для обработчика деления на ноль мы в label выводим текст сообщения для возникшего исключения:

    ...
    label1.Text = ex.Message;
    ...

Для конструкции try есть еще необязательный блок finally, который мы не используем.

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

Деление на ноль

При вводе же не чисел будет выдаваться сообщение "Неизвестная ошибка!":

Неизвестная ошибка!
Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX new!
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz
Label

 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2004 сайт progs.biz
© 2002-2004 Алексеев Игорь