|
|
|
Мы не будем объяснять, зачем исключения в C#. Это не новое веяние. Это - стандарт. Искючения были придуманы уже больше 15 лет назад, стандартный синтаксис в них берет свое начало от C++.
Исключения служат для обработки ошибок. То есть, допустим, в некотором методе у вас случается ошибка. Что делать? Можно, конечно, прервать процесс без объяснений, но это не дело. К тому же метод, в котором возникла ошибка, ничего не знает об окружении , в котором он выполняется и, стаоло быть, не вполне компетентен в выборе стратегии в нештатной ситуации. Правильно было бы сообщить об этом "наверх", вызывающему методу. В языках без поддержки исключений использовались коды ошибок - метод (функция) завершался, возвращая "особенное" значение, которое трактовалось как ошибочное. Понятно, что такой подход являлся очень неудобным (сложно передать всю информацию об ошиюке в одном числе, сложность в выделении специальных значений).
Исключения в этом смысле стали панацеей. Идея очень проста: если в каком-то происходит ошибка, создается объект, описывающий ее и генерируется исключение не его основе. При генерации исключение прекращается выполнение текущего блока и идет возврат на более высокий уровень. На нем исключение может быть "поймано" и обработано. Если оно не обрабатывается на более высоком уровне, идет переход еще выше и т.д. пока не дойдем до системного вызова, в котором все исключения обрабатываются.
Синтаксис довольно прост: в общем случае он выглядит следующим образом:
try
{
блок команд, в котором может возникнуть ошибка
}
[catch [(тип_исключения имя_исключения)]
{
блок обработки исключения
}]
[finally
{
команды, которые выполняются в любом случае
}]
|
Схема работы такой конструкции очень проста - если в блоке try происходит исключение, то идет переход на блок catch и ему это исключение передается в качестве параметра. В любом случае (произошло исключение или нет) в конце вызывается блок команд finally.
Теперь о том, как создавать исключения. Делается это с помощью команды try, которой передается объект типа Exception, который содержит информацию об исключении. Таким образом, в блоке try исключения могут возникнуть двумя способами - непосредственный вызов команды throw или необработанное исключение в одном из вызываемых методов.
Приведем небольшой пример:
class ReverseFunction
{
public static double Calculate( double f )
{
if (d == 0)
throw new Exception("Function is undefined in 0");
return 1 / d;
}
public static void Main()
{
try
{
Console.WriteLine("1 / {0} = {1}", 2, Calculate(2));
Console.WriteLine("1 / {0} = {1}", 0, Calculate(0));
Console.WriteLine("1 / {0} = {1}", 1, Calculate(1));
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e);
}
}
}
|
Можно также производить различные действия при различных типах исключения. Для этого используется несколько блоков catch подряд. При этом вызывается первый блок, чей тип исключения соответствует типу пришедшего исключения:
try
{
CalculateSpline();
}
catch (DivisionByZeroException e)
{
Console.WriteLine("Divizion by 0");
}
catch (OverflowException e)
{
Console.WriteLine("Overflow");
}
catch (Exception e) // Обработка остальных типов исключения
{
Console.WriteLine("Exception: {0}", e);
}
|
| << Предыдущая | Следующая >> |
| Контакт | Реклама на сайте | Спонсорам | Веб мастерам |
Лицензионное соглашение
- © 2000-2012 dotSITE
Хостинг .NET предоставлен
PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development