Исключительные ситуации в C#.
Исключительная ситуация, или просто исключение, происходит во время выполнения. В C# исключения представлены в виде классов. Все классы исключений должны быть производными от встроенного в C# класса Exception, являющегося частью пространства имен System. К числу самых важных подклассов Exception относится класс SystemException. Именно от этого класса являются производными все исключения, генерируемые исполняющей средой C# (т.е. системой CLR). Класс System Exception ничего не добавляет к классу Exception, а просто определяет вершину иерархии стандартных исключений. В среде.NET Framework определено несколько встроенных исключений, являющихся производными от класса SystemException. Например, при попытке выполнить деление на нуль генерируется исключение DivideByZeroException. В классе Exception определяется ряд свойств. К их числу относятся такие, как Message, StackTrace и TargetSite. Все эти свойства доступны только для чтения. Свойство Message содержит символьную строку, описывающую характер ошибки; свойство StackTrace – строку с вызовами стека, приведшими к исключительной ситуации, а свойство TargetSite получает объект, обозначающий метод, сгенерировавший исключение. Кроме того, в классе определяется ряд методов. Среди них такой, как ToString(), возвращающий символьную строку с описанием исключения. Пример применения свойств и метода класса Exception: using System; namespace Example { class Example { public static void GenException() { int[] nums = new int[4]; Console.WriteLine("До генерирования исключения."); for (int i = 0; i < 10; i++) { nums[i] = i; Console.WriteLine("nums[{0}]: {1}", i, nums[i]); } Console.WriteLine("Не подлежит выводу"); } } class ExampleDemo { static void Main() { try { Example.GenException(); } catch (IndexOutOfRangeException exc) { Console.WriteLine("стандартное сообщение: " + exc); Console.WriteLine("Свойство StackTrace: " + exc.StackTrace);
Console.WriteLine("Свойство Message: " + exc.Message); Console.WriteLine("Свойство TargetSite: " + exc.TargetSite); } Console.WriteLine("После блока перехвата исключения"); } } } Произойдет исключение – IndexOutOfRange. В классе Exception определяются четыре конструктора: · public Exception() – используется по умолчанию; · public Exception (string сообщение) – здесь указывается строка сообщение, связанная со свойством Message, которое имеет отношение к генерируемому исключению; · public Exception (string сообщение, Exception внутреннее_исключение) – используется в том случае, когда одно исключение порождает другое, причем внутреннее_исключение обозначает первое исключение, которое будет пустым, если внутреннее исключение отсутствует; · protected Exception (System.Runtime.Serialization.SerializationInfo информация, System.Runtime.Serialization.StreamingContext контекст) – обрабатывает исключения, происходящие дистанционно, и поэтому требует десериализации. Наиболее часто используемые исключения, определенные в пространстве имен System: · ArrayTypeMismatchException – тип сохраняемого значения не совместим с типом массива; · DidideByZeroException – попытка деления на нуль; · IndexOutOfRangeException – индекс оказался за пределами массива; · InvalidCastException – неверно выполнено динамическое приведение типов; · OutOfMemoryException – Недостаточно свободной памяти для дальнейшего выполнения программы; · OverflowException – произошло арифметическое переполнение; · NullReferenceException – попытка использовать пустую ссылку, т.е. ссылку, которая не указывает ни на один из объектов. Также можно создавать собственные классы исключений, производные от класса Exception.
Способы обработки ошибок. Исключительная ситуация, или просто исключение, происходит во время выполнения. Обработка исключительных ситуаций в С# организуется с помощью четырех ключевых слов: try, catch, throw и finally. Они образуют взаимосвязанную подсистему, в которой применение одного из ключевых слов подразумевает применение другого.
Операторы программы, которые требуется контролировать на появление исключений, заключаются в блок try. Если внутри блока try возникает исключительная ситуация, генерируется исключение. Это исключение может быть перехвачено и обработано каким-нибудь рациональным способом в коде программы с помощью оператора, обозначаемого ключевым словом catch. Исключения, возникающие на уровне системы, генерируются исполняющей средой автоматически. А для генерирования исключений вручную служит ключевое слово throw. Любой код, который должен быть непременно выполнен после выхода из блока try, помещается в блок finally. Ключевые слова try и catch не могут быть использованы порознь. Общая форма для этих блоков: try { //блок кода, проверяемый на наличие ошибок } catch (ExceptionType1 exOb) { //Обработчик исключений типа ExceptionType1 } catch (ExceptionType2 exOb) { //Обработчик исключений типа ExceptionType2 }… где ExceptionType – это тип возникающей исключительной ситуации. Когда исключение генерируется оператором try, оно перехватывается составляющим ему пару оператором catch, который затем обрабатывает исключение. Когда исключение перехватывается, переменная exOb получает свое значение. Но ее указывать необязательно. Если в операторе catch не указывается тип и переменная исключения, то оператор перехватывает все исключения. Исключение может быть сгенерировано вручную с помощью оператора throw. Общая форма такого генерирования: throw exceptOb; где в качестве exceptOb должен быть обозначен объект класса исключений, производного от класса Exception. Например: throw new DivideByZeroException (); Если объект еще не создан перед генерированием исключений, используется оператор new, т.к. генерируется конкретный объект. Пример обработки ошибок с помощью блоков try/catch/finally: using System; namespace Example { class Example { public static void GenException(int what) { int t; int[] nums = new int[2]; Console.WriteLine("Получить " + what); try { switch (what) { case 0: t = 10 / what; break; case 1: nums[4] = 4; break; case 2: return; } } catch (DivideByZeroException) { Console.WriteLine("Делить на нуль нельзя!"); return; } catch (IndexOutOfRangeException) { Console.WriteLine("Совпадающий элемент не найден."); } finally { Console.WriteLine("После выхода из блока try"); } } }
class ExampleDemo { static void Main() { for (int i = 0; i < 3; i++) { Example.GenException(i); Console.WriteLine(); } } } }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|