90 likes | 274 Views
Обработка исключений в C#. Единая техника обнаружения ошибок времени выполнения и передачи информации о них. Что было?. Собственная логика выявления для каждого приложения. Субъективный подход программиста (или группы разработчиков) к проблеме обработки исключений.
E N D
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
Что было? • Собственная логика выявления для каждого приложения. • Субъективный подход программиста (или группы разработчиков) к проблеме обработки исключений. • Нет единого стандарта (разные методики и встроенные средства в Win32 API, COM, MFC)… • Привязка методики к конкретному языку, алгоритму, проекту.
Вуаля - Structured Exception Handling • В .NET было приято навести порядок буквально во всём. • Единый и хорошо продуманный подход к обработке ошибок. • Единый подход для всех языков .NET. • Бонус – генерация и перехват исключений между двоичными файлами, AppDomains и компьютерами в независимом от языка стиле. • Как – RFTM.
System.Exception. Основные свойства. • HelpLink – URL файла справки с описанием ошибки. • Message – текстовое описание ошибки (Read Only). • Source – Имя объекта (или приложения), сгенерировавшего ошибку. • StackTrace – Последовательность вызовов, которые привели к ошибке (Read Only). • Inner exception – Используется для сохранения сведений об ошибке между сериями исключений.
Как и когда использовать. • Исключения используются тогда, когда выполнение метода должно быть немедленно прервано. • При проектировании класса необходимо определиться, где и как будут использоваться исключения. • В .NET уже определены различные стандартные исключения (ArgumentOutOfRangeException, IndexOutOfRangeException, StackOverflowException и др).
Пришёл, проник и обезвредил… 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»будет обрабатывать вообще все сгенерированные исключения.
Хотим свой класс для обработки исключений. 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); }
Можно проще! public class MyObjectIsDead : Exception { public MyObjectIsDead() {} public MyObjectIsDead(string message) : base(message) {} public MyObjectIsDead(string message, Exception innerEx) : base(message, innerEx) {} }
Что ещё… • Обработка нескольких исключений – просто несколько блоков catch. • Необязательный блок finally после try/catch – будет выполнен независимо от того, сработало ли исключение (освобождение ресурсов, отключение от БД…). • Не допускать не отловленных исключений (если нет желания вести неприятные диалоги с отладчиком)!! • Не допускать бесконечных исключений (не помещать генерацию того же исключения в catch)!! • Всегда чётко продумывать, что нужно делать с отловленным исключением. • Не использовать исключения без острой необходимости. • RFTM (2й семестр)…