Исключения

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