.
Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)
Автор megabax   
28.11.2011 г.
В этой статье я постараюсь максимально просто и понятно изложить основы программирования на языке Delphi

Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)

 

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

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

Начнем с небольшого примера (опять же это будет пример консольного приложения):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void M1(int x, int y, int z)

        {

            try

            {

                int a = checked((int)Math.Pow(x, y));

                Console.WriteLine("x ^ y / z = {0}", a / z);

            }

            catch (DivideByZeroException)

            {

                Console.WriteLine("Делить на ноль нельзя");

            }

            Console.WriteLine("M1 - завершено");

        }

 

        static void M2(int x, int y, int z)

        {

            try

            {

                M1(x, y, z);

            }

            catch (ArithmeticException)

            {

                Console.WriteLine("Арифметическая ошибка");

            }

            Console.WriteLine("M2 - завершено");

        }

 

 

        static void Main(string[] args)

        {

            Console.Write("x=");

            int x = int.Parse(Console.ReadLine());

            Console.Write("y=");

            int y = int.Parse(Console.ReadLine());

            Console.Write("z=");

            int z = int.Parse(Console.ReadLine());

            M2(x, y, z);

            Console.ReadLine();

        }

    }

}

Данная программа попросит нас ввести три числа x, y и z, а потом выдаст результат вычисления по формуле

xy/z

Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)

Что будет, если в качестве z мы введем 0? Программа у нас выдаст сообщение об ошибке, ясное и понятное:

Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)

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

            try

            {

                int a = checked((int)Math.Pow(x, y));

                Console.WriteLine("x ^ y / z = {0}", a / z);

            }

            catch (DivideByZeroException)

            {

                Console.WriteLine("Делить на ноль нельзя");

            }

то у нас бы произошло аварийно завершение программы со страшным ругательством:

Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)

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

После слова catch в скобках стоит класс исключительной ситуации. Например, если произошло деление на нуль то это класса DivideByZero. Данный обработчик исключения будет обрабатывать только ошибки деления на нуль. Другие ошибки он обрабатывать не будет. Например, если вы введете слишком большие числа для возведения в степень, то процедура M1 - завершиться аварийно и эту ошибку обработает уже другой обработчик, который находиться в функции M2

            try

            {

                M1(x, y, z);

            }

            catch (ArithmeticException)

            {

                Console.WriteLine("Арифметическая ошибка");

            }

вот как будет выглядеть эффект обработки подобной ошибки:

Visual C# для чайников. Урок 8. Обработка исключений (try,catch,exception)

 


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  программного продукта "Microsoft Visual Studio 2010 Professional", авторское право на который принадлежит корпорации Microsoft.. 


 

 

(С) Шуравин Александр

 

Последнее обновление ( 14.04.2014 г. )