Обработка исключений в 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й семестр)…