myCar.CrankTunes(true);
// Разогнаться до скорости, превышающей максимальный
// предел автомобиля, с целью выдачи исключения
try
{
for(int i = 0; i < 10; i++)
{
myCar. Accelerate(10);
}
}
catch(Exception e)
{
Console.WriteLine("\n*** Error! ***"); // ошибка
Console.WriteLine("Method: {0}", e.TargetSite); // метод
Console.WriteLine("Message: {0}", e.Message); // сообщение
Console.WriteLine("Source: {0}", e.Source); // источник
}
// Ошибка была обработана, выполнение продолжается со следующего оператора.
Console.WriteLine("\n***** Out of exception logic *****");
Console.ReadLine();
По существу блок try
catch
. С другой стороны, если код внутри блока try
исключение не сгенерировал, то блок catch
полностью пропускается, и выполнение проходит обычным образом. Ниже представлен вывод, полученный в результате тестового запуска данной программы:***** 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
=> CurrentSpeed = 100
*** Error! ***
Method: Void Accelerate(Int32)
Message: Zippy has overheated!
Source: SimpleException
***** Out of exception logic *****
Как видите, после обработки исключения приложение может продолжать свое функционирование с оператора, находящегося после блока catch
Выражение throw (нововведение в версии 7.0)
До выхода версии C# 7 ключевое слово throw
throw
доступно также в виде выражения и может использоваться везде, где разрешены выражения.Конфигурирование состояния исключения
В настоящий момент объект System.Exception
Accelerate()
, просто устанавливает значение, доступное через свойство Message
(посредством параметра конструктора). Как было показано ранее в табл. 7.1, класс Exception
также предлагает несколько дополнительных членов (TargetSite
, StackTrace
, HelpLink
и Data
), которые полезны для дальнейшего уточнения природы возникшей проблемы. Чтобы усовершенствовать текущий пример, давайте по очереди рассмотрим возможности упомянутых членов.Свойство TargetSite
Свойство System.Exception.TargetSite
TargetSite
отобразится возвращаемое значение, имя и типы параметров метода, который сгенерировал исключение. Однако свойство TargetSite
возвращает не простую строку, а строго типизированный объект System.Reflection.MethodBase
. Данный тип можно применять для сбора многочисленных деталей, касающихся проблемного метода, а также класса, в котором метод определен. В целях иллюстрации измените предыдущую логику в блоке catch
следующим образом:// Свойство TargetSite в действительности возвращает объект MethodBase.
catch(Exception e)
{
Console.WriteLine("\n*** Error! ***");