
5-6. Механизм обработки исключений.pptx
- Количество слайдов: 13
Уборка мусора. Обработка исключений Кафедра МОи. АИС Скорнякова А. Ю. ayuskornyakova@mesi. ru
Управляемая куча • Выделить память для типа, представляющего ресурс (обычно это делается при помощи оператора new в C#) • Инициализировать выделенную память, установив начальное состояние ресурса и сделав его пригодным к использованию. За установку начального состояния типа отвечает его конструктор. • Использовать ресурс, обращаясь к членам его типа (при необходимости операция может повторяться). • В рамках процедуры очистки ликвидировать состояние ресурса • Освободить память. За этот этап отвечает исключительно сборщик мусора.
Сборщик мусора (Garbage collector) Сборщик мусора. NET Framework управляет выделением и освобождением памяти для приложения. • При каждом создании нового объекта среда CLR выделяет память для объекта из управляемой динамически распределяемой памяти (кучи). • Пока в управляемой куче имеется доступное адресное пространство, среда выполнения продолжает выделять пространство для новых объектов. • Механизм оптимизации сборщика мусора определяет наилучшее время для выполнения сбора, основываясь на произведенных выделениях памяти. • В ходе выполнения очистки сборщик мусора отыскивает в управляемой куче объекты, которые более не используются приложением, и освобождает выделенную для них память.
Процесс сборки мусора. Поколения. Куча организована в виде поколений, что позволяет ей обрабатывать долгоживущие и короткоживущие объекты. Поколение 0. Это самое молодое поколение содержит короткоживущие объекты. Примером короткоживущего объекта является временная переменная. Сборка мусора чаще всего выполняется в этом поколении. Поколение 1. Это поколение содержит коротко живущие объекты и служит буфером между короткоживущими и долгоживущими объектами. Поколение 2. Это поколение содержит долгоживущие объекты. Примером долгоживущих объектов служит объект в серверном приложении, содержащий статические данные, которые существуют в течение длительности процесса. Эвристическое правило: большая часть вновь созданных объектов используются очень короткое время и их спокойно можно будет удалить при первой же возможности.
GC - класс Управляет системным сборщиком мусора — службой, которая автоматически высвобождает неиспользуемую память. Max. Generation возвращает максимальный номер поколения, который поддерживается системой. Метод Collect Принудительный вызов сборщика мусора. Get. Generation Возвращает номер поколения, в котором находится заданный объект. Get. Total. Memory Возвращает число байт, занимаемых в данный момент в управляемой куче Wait. For. Pending. Finalizers Останавливает текущий поток до завершения выполнения методов Finalize Удалит все объекты, больше не используемые программой: GC. Collect(); GC. Wait. For. Pending. Finalizers(); GC. Collect();
GC - класс private class Test. Object 1 { private byte[] ar; public Test. Object 1(int n) { ar = new byte[n]; } } private static void Do. Test 0(int max. Obj. Size, int max. List. Size) { Test. Object 1[] coll = new Test. Object 1[max. List. Size]; int n = 0; for (int i 1 = 0; i 1 < 10; i 1++) for (int i 2 = 0; i 2 < max. List. Size; i 2++) coll[n] = new Test. Object 1(max. Obj. Size); } private static void Do. Test(int max. Obj. Size, int max. List. Size) { //…То же что и в Do. Test 0 GC. Collect(); GC. Wait. For. Pending. Finalizers(); GC. Collect(); } private static void Main() { Do. Test(100, 100000); //Do. Test 0(100, 100000); Console. Write. Line(GC. Get. Total. Memory(false)); Console. Read. Line(); }
Различные виды аномалий. Исключения. • Программные ошибки (bugs) • Пользовательские ошибки (user errors) • Исключения (exceptions) В. NET поддерживается стандартная методика для генерации и выявления ошибок в исполняющей среде, называемая структурированной обработкой исключений (SEH - structured exception handling). Программирование со структурированной обработкой исключений подразумевает использование четырех следующих связанных между собой сущностей: • тип класса, который представляет детали исключения; • член, способный генерировать (throw) в вызывающем коде экземпляр класса исключения при соответствующих обстоятельствах; • блок кода на вызывающей стороне, ответственный за обращение к члену, в котором может произойти исключение; • блок кода на вызывающей стороне, который будет обрабатывать (или перехватывать (catch)) исключение в случае его возникновения.
Механика обработки исключений static double Safe. Division(double x, double y) { if (y == 0) throw new System. Divide. By. Zero. Exception(); return x / y; } static void Main() { // Input for test purposes. Change the values to see // exception handling behavior. double a = 98, b = 0; double result = 0; try { result = Safe. Division(a, b); Console. Write. Line("{0} divided by {1} = {2}", a, b, result); } catch (Divide. By. Zero. Exception e) { Console. Write. Line("Attempted divide by zero. "); } }
Общие сведения • Исключения имеют типы, в конечном счете являющиеся производными от System. Exception. • Следует использовать блок try для заключения в него инструкций, которые могут выдать исключения. • При возникновении исключения в блоке try поток управления немедленно переходит к первому соответствующему обработчику исключений, присутствующему в стеке вызовов. • Если обработчик для определенного исключения не существует, выполнение программы завершается с сообщением об ошибке. • Не перехватывайте исключение, если его нельзя обработать, и оставьте приложение в известном состоянии. • Если в блоке catch определяется переменная исключения, ее можно использовать для получения дополнительной информации о типе произошедшего исключения. • Исключения могут явно генерироваться программной с помощью ключевого слова throw. • Объекты исключения содержат подробные сведения об ошибке, такие как состояние стека вызовов и текстовое описание ошибки. • Код в блоке finally выполняется, даже при возникновении исключения.
Класс System. Exception Класс Exception является базовым классом, из которого наследуются исключения. Большинство объектов исключения являются экземплярами некоторого класса, производного от Exception, но в качестве исключения можно создавать любой объект, унаследованный от класса Object. Обратите внимание, что не все языки поддерживают генерацию и перехват тех объектов, которые не являются производными класса Exception. Почти во всех случаях рекомендуется создавать и перехватывать только объекты Exception.
Приемы работы с исключениями Не надо перехватывать все исключения! Корректное восстановление после исключения
Обработка нескольких исключений public class Car. Is. Not. Real. Exception : Application. Exception { public string Cause { get; set; } public Car. Is. Not. Real. Exception(string message, string cause) : base(message) { this. Cause = cause; } private static void Main() { var my. Car = new Car(); try { my. Car. Accelerate(-10); } catch (Car. Is. Not. Real. Exception ex 0) { Console. Write. Line(ex 0. Cause); } catch (Argument. Out. Of. Range. Exception ex 1) { Console. Write. Line(ex 1. Message); } } public class Car { public void Accelerate(int delta) { if (delta < 0) throw new System. Argument. Out. Of. Range. Exception(); //какие-то действия. . . } } }
Вопросы к экзамену • Garbage collector • Обработка исключений
5-6. Механизм обработки исключений.pptx