Download presentation
Presentation is loading. Please wait.
1
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
2
Что было? Собственная логика выявления для каждого приложения. Субъективный подход программиста (или группы разработчиков) к проблеме обработки исключений. Нет единого стандарта (разные методики и встроенные средства в Win32 API, COM, MFC)… Привязка методики к конкретному языку, алгоритму, проекту.
3
Вуаля - Structured Exception Handling В.NET было приято навести порядок буквально во всём. Единый и хорошо продуманный подход к обработке ошибок. Единый подход для всех языков.NET. Бонус – генерация и перехват исключений между двоичными файлами, AppDomains и компьютерами в независимом от языка стиле. Как – RFTM.
4
System.Exception. Основные свойства. HelpLink – URL файла справки с описанием ошибки. Message – текстовое описание ошибки (Read Only). Source – Имя объекта (или приложения), сгенерировавшего ошибку. StackTrace – Последовательность вызовов, которые привели к ошибке (Read Only). Inner exception – Используется для сохранения сведений об ошибке между сериями исключений.
5
Как и когда использовать. Исключения используются тогда, когда выполнение метода должно быть немедленно прервано. При проектировании класса необходимо определиться, где и как будут использоваться исключения. В.NET уже определены различные стандартные исключения (ArgumentOutOfRangeException, IndexOutOfRangeException, StackOverflowException и др).
6
Пришёл, проник и обезвредил… public static int Main (string[] args) { MyObject a = new MeObject(); try { a.DoSmthUnreal(); if (a.IsDead()) { throw new Exception(“Your object is dead!”); } catch(Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } «Просто catch» будет обрабатывать вообще все сгенерированные исключения.
7
Хотим свой класс для обработки исключений. public class MyObjectIsDead : Exception { private string ObjName; public MyObjectIsDead() {} public MyObjectIsDead(string ObjName) { this.ObjName = ObjName; } public override string Message { get { string msg = base.Message; if (ObjName != null) { msg += ObjName; } return msg; } catch(MyObjectIsDead e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); }
8
Можно проще! public class MyObjectIsDead : Exception { public MyObjectIsDead() {} public MyObjectIsDead(string message) : base(message) {} public MyObjectIsDead(string message, Exception innerEx) : base(message, innerEx) {} }
9
Что ещё… Обработка нескольких исключений – просто несколько блоков catch. Необязательный блок finally после try/catch – будет выполнен независимо от того, сработало ли исключение (освобождение ресурсов, отключение от БД…). Не допускать не отловленных исключений (если нет желания вести неприятные диалоги с отладчиком)!! Не допускать бесконечных исключений (не помещать генерацию того же исключения в catch)!! Всегда чётко продумывать, что нужно делать с отловленным исключением. Не использовать исключения без острой необходимости. RFTM (2й семестр)…
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.