Язык программирования C#9 и платформа .NET5
Часть 156 из 642 Информация о книге
Member type: MethodMessage: Zippy has overheated!Source: SimpleExceptionСвойство StackTrace
Свойство
позволяет идентифицировать последовательность вызовов, которая в результате привела к генерации исключения. Значение данного свойства никогда не устанавливается вручную — это делается автоматически во время создания объекта исключения. Чтобы удостовериться в сказанном, модифицируйте логику в блокеSystem.Exception.StackTrace:catchcatch(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. Message можно извлечь читабельную информацию и отобразить ее конечному пользователю. Вдобавок можно установить свойствоSystem.Exceptionдля указания на специальный URL или стандартный справочный файл, где приводятся более подробные сведения о проблеме.HelpLinkПо умолчанию значением свойства
является пустая строка. Обновите исключение с использованием инициализации объектов, чтобы предоставить более интересное значение. Ниже показан модифицированный код метода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:HelpLinkcatch(Exception e){...Console.WriteLine("Help Link: {0}", e.HelpLink);}Свойство Data
Свойство
классаDataпозволяет заполнить объект исключения подходящей вспомогательной информацией (такой как отметка времени). СвойствоSystem.Exceptionвозвращает объект, который реализует интерфейс по имениData, определенный в пространстве именIDictionary. В главе 8 исследуется роль программирования на основе интерфейсов, а также рассматривается пространство именSystem.Collections. В текущий момент важно понимать лишь то, что словарные коллекции позволяют создавать наборы значений, извлекаемых по ключу. Взгляните на очередное изменение метода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!")