
C#_2.ppt
- Количество слайдов: 16
C# исключения Если во время выполнения программы возникает ошибка или непредвиденная ситуация, то генерируется исключение (exception). Например деление на 0 или нехватка памяти. Исключение содержит подробную информацию об ошибке или непредвиденной ситуации. После генерации исключения, его можно перехватить и выполнить некоторые действия, например вывести сообщение. Для обработки исключений код разбивается на два блока – try и catch. В блоке try содержится код в котором может произойти исключение, а в catch – код для обработки исключений. try { // код где возможен “непорядок” } catch { // код, обрабатывающий “непорядок”, если он проявился // Вызывается только если было исключение }
C# исключения try { int my; int zero = 0; Console. Write. Line(“Попытка деления на 0”); my = 1 / zero; // в этом месте генерируется исключение my = zero / 20; Console. Write. Line(“Это сообщение никогда не будет показано”); } catch { // обработка ислючения Console. Write. Line(“В блоке try было сгенерировано исключение”); }
C# исключения Для более корректной обработки может потребоваться необязательный блок finally. Например может быть надо закрыть ранее открытые файлы. Код в блоке finally выполняется всегда, даже если исключения не было !!!. try { // код где возможен “непорядок” } catch { // код, обрабатывающий “непорядок”, если он проявился } finally { // код корректно завершающий работу предыдущего блока // (либо catch, либо try). Этот код всегда выполняется }
C# исключения На самом деле исключение является объектом. Когда генерируется исключение вообще, в блок catch передается объект класса System. Exception. В этом классе есть различные свойства которые можно использовать при обработке исключений Свойство Тип Help. Link string Описание Свойству можно присвоить имя файла или URL, где содержится доп. информация Inner. Exception Содержит ссылку на внутренне исключение Message string Содержит описание исключения Source string Содержит имя программы, вызвавшей исключение Stack. Trace string Содержит имя класса и метода, вызвавшего исключение Target. Site Method. Base Содержит имя метода, из которого было вызвано исключение
C# исключения using System class Example { public static void Main() { try { int my; int zero = 0; Console. Write. Line(“Попытка деления на 0”); my = 1 / zero; // генерируетисключение } catch( System. Exception my. Exception) { Console. Write. Line(“Help. Link = ” + my. Exception. Help. Link); Console. Write. Line(“Message = ” + my. Exception. Message); Console. Write. Line(“Source = ” + my. Exception. Source); Console. Write. Line(“Stack. Trace = ” + my. Exception. Stack. Trace); Console. Write. Line(“Target. Site = ” + my. Exception. Target. Site); } } }
C# исключения Результат запуска: Попытка деления на 0 Help. Link = Message = Attemped to divide by zero Source = Example Stack. Trace = at Example. Main() Target. Site = void Main(); При таком использовании в блоке catch обрабатывается объект базового для исключений класса Exception. На самом деле существуют множество классов исключений, унаследованных от базового класса. Эти классы можно использовать для обработки конкретных видов исключений. Это нужно, ккогда для различных исключений требуется различный код.
C# исключения Arithmetic. Exception Базовый класс для исключений, генерируемых арифметическими операциями (для Divide. By. Zero. Exception и Overflow. Exception) Array. Type. Mismatch. Exception Генерируется при попытке записи объекта несовместимого типа в массив Divide. By. Zero. Exception Генерируется при попытке деления на ноль Index. Out. Of. Range. Exception Генерируется при попытке доступа к несуществующему элементу массива Multicast. Not. Supported. Exception Генерируется при попытке комбинирования двух делегатов, не возвращающих значения типа void Null. Reference. Exception Генерируется при попытке использования ссылки на объект, равной null Out. Of. Memory. Exception Генерируется при неудачной попытке выделения памяти оператором new Overflow. Exception Генерируется в случае, когда результат ар. операции выходит за границы допустимого диапазона типа, и использовался оператор checked
C# исключения Stack. Overflow. Exception Генерируется в случае, когда переполняется стек выполнения Type. Initialization. Exception Генерируется в случае, когда отсутствует блок catch для обработки исключения, сгенерированного статическим конструктором. Одно конкретное исключение можно обработать одним блоком catch. Для этого нужно указать имя класса для этого исключения using System class Example { public static void Main() { try { int my; int zero = 0; Console. Write. Line(“Попытка деления на 0”); my = 1 / zero; // генерируетисключение }
C# исключения catch( Divide. By. Zero. Exception my. Exception) { Console. Write. Line(“Message = ” + my. Exception. Message); Console. Write. Line(“Stack. Trace = ” + my. Exception. Stack. Trace); } } } Можно использовать несколько блоков catch для обработки разных исключений try { // код, который может сгенерировать исключение } catch (Divide. By. Zero. Exception e) { // код, lделение на 0} catch (Index. Out. Of. Range. Exception e { // код обрабатывающий выход за границы массива} catch (Exception e) {// код обрабатывающий исключение Exception – для остальных исключений}
C# исключения class Example { public static void Main() { try { int [ ] my. Array = new int[2]; int zero = 0; Console. Write. Line(“Попытка доступа к несуществующему элементу”); my. Array[2] = 10; Console. Write. Line(“Попытка деления на 0”); my = 1 / zero; // генерируетисключение } catch( Divide. By. Zero. Exception e) { Console. Write. Line(“Обработка объекта System. Divide. By. Zero. Exception ”); Console. Write. Line(“Message = ” + e. Message); Console. Write. Line(“Stack. Trace = ” + e. Stack. Trace); } catch( Index. Out. Of. Range. Exception e) { Console. Write. Line(“Обработка объекта System. Index. Out. Of. Range. Exception ”); Console. Write. Line(“Message = ” + e. Message); Console. Write. Line(“Stack. Trace = ” + e. Stack. Trace); }
C# исключения catch( Exception e) { // обработка всех остальных исключений Console. Write. Line(““Обработка объекта System. Exception ”); Console. Write. Line(“Message = ” + e. Message); Console. Write. Line(“Stack. Trace = ” + e. Stack. Trace); } } } Результат выполнения : Попытка доступа к несуществующему элементу Обработка объекта System. Index. Out. Of. Range. Exception Message = Exception of type System. Index. Out. Of. Range. Exception was thrown. Stack. Trace = at Example. Main*( Если программа генерирует исключение, но в коде нет ни одного соответствующего ему блока catch, то оно обрабатывается окружением CLR
C# исключения Можно создать собственный объект – исключение, а затем принудительно сгенерировать исключение при помощи оператора throw. Это полезно когда при обработке исключения надо сгенерировать еще одно исключение, связанное с первым. Например если исключение Divide. By. Zero. Exception сгенерировано и перехвачено, то после его обработки можно сгенерировать другое свое исключение. При этом можно установить для своего исключения необходимые свойства. Например можно указать где находится дополнительная информация о том, что произошло устанвливая свойство Help. Link, также присвоить свои значения свойствам Message и Source. class Example { public static void Main() { try { Exception my. Exception = new Exception(“ This is MYEXCEPTION”);
C# исключения my. Exception. Help. Link = “См. файл Readme. txt”; my. Exception. Source = “Моя программа Examlpe”; throw my. Exception; } catch( Exception e) { Console. Write. Line(“Help. Link = ” + my. Exception. Help. Link); Console. Write. Line(“Message = ” + my. Exception. Message); Console. Write. Line(“Source = ” + my. Exception. Source); Console. Write. Line(“Stack. Trace = ” + my. Exception. Stack. Trace); Console. Write. Line(“Target. Site = ” + my. Exception. Target. Site); } } } Результат : Help. Link = См. файл Readme. txt Message = This is MYEXCEPTION Source = Моя программа Examlpe Stack. Trace = at Exapmle. Main() Target. Site = void Main()
C# исключения Можно создать собственное исключение, которое например можно использовать для установки собственных значений свойств Help. Link и Source. При этом можно избежатьповторной инициализации этих свойств при создании нового объекта – исключения этого класса. В свой класс можно добавить новые методы и свойства. Пользовательские исключения наследуются от класса System. Application. Exception при этом в конструкторе пользовательского класса надо вызвать конструктор базового класса. using System public class Custom. Exception : Application. Exception { public Custom. Exception(string Message) : base(Message) { this. Help. Link = “ См. сайт www. mysite. ru”; this. Source = “ Это моя программа ”; } }
C# исключения class Example { public static void Main() { try { Console. Write. Line(“Генерация исключения типа Custom. Exception”); throw new Custom. Exception(“ Мое сообщение в классе Custom. Exception”) } catch (Custom. Exception e) { Console. Write. Line(“Help. Link = ” + my. Exception. Help. Link); Console. Write. Line(“Message = ” + my. Exception. Message); Console. Write. Line(“Source = ” + my. Exception. Source); Console. Write. Line(“Stack. Trace = ” + my. Exception. Stack. Trace); Console. Write. Line(“Target. Site = ” + my. Exception. Target. Site); } } }
C# исключения Результат запуска: Генерация исключения типа Custom. Exception Help. Link = См. сайт www. mysite. ru Message = Мое сообщение в классе Custom. Exception Source = Это моя программа Stack. Trace = at Exapmle. Main() Target. Site = void Main()