catch(Exception e)

{

  ...

  Console.WriteLine("Help Link: {0}", e.HelpLink);

}

<p id="AutBody_Root306">Свойство Data</p>

Свойство Data класса System.Exception позволяет заполнить объект исключения подходящей вспомогательной информацией (такой как отметка времени). Свойство Data возвращает объект, который реализует интерфейс по имени IDictionary, определенный в пространстве имен System.Collections. В главе 8 исследуется роль программирования на основе интерфейсов, а также рассматривается пространство имен System.Collections. В текущий момент важно понимать лишь то, что словарные коллекции позволяют создавать наборы значений, извлекаемых по ключу. Взгляните на очередное изменение метода Car.Accelerate():

public void Accelerate(int delta)

{

  if (_carIsDead)

  {

    Console.WriteLine("{0} is out of order...", PetName);

  }

   else

  {

    CurrentSpeed += delta;

    if (CurrentSpeed >= MaxSpeed)

    {

      Console.WriteLine("{0} has overheated!", PetName);

      CurrentSpeed = 0;

      _carIsDead = true;

      // Использовать ключевое слово throw для генерации

      // исключения и возврата в вызывающий код.

      throw new Exception($"{PetName} has overheated!")

      {

        HelpLink = "http://www.CarsRUs.com",

        Data = {

          {"TimeStamp",$"The car exploded at {DateTime.Now}"},

          {"Cause","You have a lead foot."}

        }

      };

    }

    Console.WriteLine("=> CurrentSpeed = {0}", CurrentSpeed);

  }

}

С целью успешного прохода по парам "ключ-значение" добавьте директиву using для пространства имен System.Collections, т.к. в файле с операторами верхнего уровня будет применяться тип DictionaryEntry:

using System.Collections;

Затем обновите логику в блоке catch, чтобы обеспечить проверку значения, возвращаемого из свойства Data, на равенство null (т.е. стандартному значению). После этого свойства Key и Value типа DictionaryEntry используются для вывода специальных данных на консоль:

catch (Exception e)

{

  ...

  Console.WriteLine("\n-> Custom Data:");

  foreach (DictionaryEntry de in e.Data)

  {

    Console.WriteLine("-> {0}: {1}", de.Key, de.Value);

  }

}

Вот как теперь выглядит финальный вывод программы:

***** Simple Exception Example *****

=> Creating a car and stepping on it!

Jamming...

=> CurrentSpeed = 30

=> CurrentSpeed = 40

=> CurrentSpeed = 50

=> CurrentSpeed = 60

=> CurrentSpeed = 70

=> CurrentSpeed = 80

=> CurrentSpeed = 90

*** Error! ***

Member name: Void Accelerate(Int32)

Class defining member: SimpleException.Car

Member type: Method

Message: Zippy has overheated!

Source: SimpleException

Stack: at SimpleException.Car.Accelerate(Int32 delta) ...

       at SimpleException.Program.Main(String[] args) ...

Help Link: http://www.CarsRUs.com

-> Custom Data:

-> TimeStamp: The car exploded at 3/15/2020 16:22:59

-> Cause: You have a lead foot.

***** Out of exception logic *****

Свойство Data удобно в том смысле, что оно позволяет упаковывать специальную информацию об ошибке, не требуя построения нового типа класса для расширения базового класса Exception. Тем не менее, каким бы полезным ни было свойство Data, разработчики все равно обычно строят строго типизированные классы исключений, которые поддерживают специальные данные, применяя строго типизированные свойства.

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

Перейти на страницу:

Похожие книги