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, который мы не используем.
После запуска наша программа будет выдавать при делении на ноль соответствующее сообщение:
При вводе же не чисел будет выдаваться сообщение "Неизвестная ошибка!":
|