Лекция 15. Создание классов исключений и класс Exception

В теме Обработка исключений мы уже говорили в целом об обработчике исключений. Сейчас же поговорим о создании своих классов исключений в рамках объектно-ориентированного подхода.

Базовым классом для всех исключений является класс Exception. Он хранит всю информацию о произошедшем исключении. Эту информацию мы можем получить через свойства класса.

Некоторые свойства класса Exception:

- Helplink: хранит адрес интернет-ресурса, на котром можно найти всю информацию об ошибке

- InnerException: объект класса Exception, хранит информацию об исключении, которое послужило причиной текущего исключения

- Message: хранит сообщение об исключении, текст ошибки

- Source: хранит имя объекта или сборки, которое вызвало исключение

- StackTrace: возвращает строковое представление стека вызывов, которые привели к возникновению исключения

- TargetSite: возвращает метод, в котором и было вызвано исключение

Применим свойства на примере. Допустим, у нас в программе будет ограничение по возрасту:

class Program

{

   static void Main(string[] args)

   {

       try

       {

           Person p = new Person();

           p.Age = 17;

       }

       catch (Exception ex)

       {

           Console.WriteLine("Ошибка: " + ex.Message);

           Console.WriteLine("Метод: " + ex.TargetSite); // Void set_Age(Int32)

               

       }

       Console.ReadLine();

   }

}

 

class Person

{

   private string name;

   public string Name

   {

       get { return name; }

       set { name = value; }

   }

   private int age;

   public int Age

   {

       get { return age; }

       set

       {

           if (value < 18)

           {

               throw new Exception("Лицам до 18 регистрация запрещена");

           }

           else

           {

               age = value;

           }

       }

   }

}

В классе Person при установке возраста происходит проверка, и если возраст меньше 18, то выбрасывается исключение. Класс Exception принимает в конструкторе в качестве параметра строку, которое затем передается в его свойство Message.

Но иногда удобнее использовать свои классы исключений. Например, в какой-то ситуации мы хотим обработать определенным образом только те исключения, которые относятся к классу Person. Для этих целей мы можем сделать специальный класс PersonException:

class PersonException: Exception

{

public PersonException(string message)

  : base(message)

{ }

}

По сути класс кроме пустого конструктора ничего не имеет, и то в конструкторе мы просто обращаемся к конструктору базового класса Exception, передавая в него строку message. Но теперь мы можем изменить класс Person, чтобы он выбрасывал исключение именно этого типа и соответственно в основной программе обрабатывать это исключение:

class Program

{

   static void Main(string[] args)

   {

       try

       {

           Person p = new Person();

           p.Age = 17;

       }

       catch (PersonException ex)

       {

           Console.WriteLine("Ошибка: " + ex.Message);

               

       }

       Console.ReadLine();

   }

}

 

class Person

{

   private int age;

   public int Age

   {

       get { return age; }

       set

         {

           if (value < 18)

           {

               throw new PersonException("Лицам до 18 регистрация запрещена");

           }

           else

           {

               age = value;

           }

       }

   }

}

 

Лекция 15. Анонимные типы

Анонимные типы позволяют создать объект с некоторым набором свойств без определения класса. Анонимный тип определяется с помощью ключевого слова var и инициализатора объектов:

var user = new { Name = "Tom", Age = 34 };

Console.WriteLine(user.Name);

В данном случае user - это объект анонимного типа, у которого определены два свойства Name и Age. И мы также можем использовать его свойства, как и у обычных объектов классов. Однако тут есть ограничение - свойства анонимных типов доступны только для чтения.

При этом во время компиляции компилятор сам будет создавать для него имя типа и использовать это имя при обращении к объекту. Нередко анонимные типы имеют имя наподобие "<>f__AnonymousType0'2".

Для исполняющей среды CLR анонимные типы будут также, как и классы, представлять ссылочный тип.

Если в программе используются несколько объектов анонимных типов с одинаковым набором свойств, то для них компилятор создаст одно определение анонимного типа:

var user = new { Name = "Tom", Age = 34 };

var student = new { Name = "Alice", Age = 21 };

var manager = new { Name = "Bob", Age = 26, Company = "Microsoft" };

 

Console.WriteLine(user.GetType().Name); // <>f__AnonymousType0'2

Console.WriteLine(student.GetType().Name); // <>f__AnonymousType0'2

Console.WriteLine(manager.GetType().Name); // <>f__AnonymousType1'3

Здесь user и student будут иметь одно и то же определение анонимного типа. Однако подобные объекты нельзя преобразовать к какому-нибудь другому типу, например, классу, даже если он имеет подобный набор свойств.

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

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: