Литмир - Электронная Библиотека
A
A

Member type: Method

Message: Zippy has overheated!

Source: SimpleException

Свойство StackTrace

Свойство

System.Exception.StackTrace
позволяет идентифицировать последовательность вызовов, которая в результате привела к генерации исключения. Значение данного свойства никогда не устанавливается вручную — это делается автоматически во время создания объекта исключения. Чтобы удостовериться в сказанном, модифицируйте логику в блоке
catch
:

catch(Exception e)

{

  ...

  Console.WriteLine("Stack: {0}", e.StackTrace);

}

Снова запустив программу, в окне консоли можно обнаружить следующие данные трассировки стека (естественно, номера строк и пути к файлам у вас могут отличаться):

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

in [путь к файлу]\car.cs:line 57 at <Program>$.<Main>$(String[] args)

in [путь к файлу]\Program.cs:line 20

Значение типа

string
, возвращаемое свойством
StackTrace
, отражает последовательность вызовов, которая привела к генерации данного исключения. Обратите внимание, что самый нижний номер строки в
string
указывает на место возникновения первого вызова в последовательности, а самый верхний — на место, где точно находится проблемный член. Очевидно, что такая информация очень полезна во время отладки или при ведении журнала для конкретного приложения, т.к. дает возможность отследить путь к источнику ошибки.

Свойство HelpLink

Хотя свойства

TargetSite
и
StackTrace
позволяют программистам выяснить, почему возникло конкретное исключение, информация подобного рода не особенно полезна для пользователей. Как уже было показано, с помощью свойства
System.Exception
. Message можно извлечь читабельную информацию и отобразить ее конечному пользователю. Вдобавок можно установить свойство
HelpLink
для указания на специальный URL или стандартный справочный файл, где приводятся более подробные сведения о проблеме.

По умолчанию значением свойства

HelpLink
является пустая строка. Обновите исключение с использованием инициализации объектов, чтобы предоставить более интересное значение. Ниже показан модифицированный код метода
Car.Accelerate()
:

public void Accelerate(int delta)

{

  if (_carIsDead)

  {

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

  }

  else

  {

    CurrentSpeed += delta;

    if (CurrentSpeed >= MaxSpeed)

    {

      CurrentSpeed = 0;

      _carIsDead = true;

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

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

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

      {

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

      };

    }

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

  }

}

Теперь можно обновить логику в блоке

catch
для вывода на консоль информации из свойства
HelpLink
:

catch(Exception e)

{

  ...

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

}

Свойство Data

Свойство

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!")

156
{"b":"847442","o":1}