Посты для тега : ‘исключение’

Обеспечение нейтральности к исключениям

Когда исключения были впервые добавлены к С++, многие разработчики были впечатлены возможностью генерировать их, перехватывать и обрабатывать. Фактически в то время существовало распространенное заблуждение, что обработка исключений состоит из стратегического размещения операторов try по всему коду и добавления throw при необходимости.

Читать далее »

Базовая структура нейтрального к исключениям кода

Общая идея, лежащая в основе написания нейтрального к исключениям кода, подобна идее, лежащей в основе кода фиксации/отката (commit/rollback). При этом пишется такой код, который гарантирует, что если его выполнение не завершено, то вся операция отменяется без каких-либо последствий для состояния системы. Изменения в состоянии фиксируются только в том случае, когда код достигает конечной точки выполнения.

Читать далее »

Механизм обработки исключений в C#

Где должны обрабатываться исключения? Ответ можно найти, применив вариант шаблона Expert (Эксперт), который устанавливает, что работа должна выполняться сущностью, являющейся экспертом в данной области. Это — окольный путь уведомить, что исключение должно перехватываться в точке, где его действительно можно обработать с уровнем знаний, достаточным для того, чтобы справиться с исключительной ситуацией наилучшим образом.

Читать далее »

Обеспечение поведения отката

Разрабатывая нейтральные к исключениям методы, часто оказывается удобным механизм, который может выполнять откат любых изменений в случае генерации исключения. Эту задачу можно решить, применив классическую технику ввода дополнительного промежуточного уровня в виде вспомогательного класса. Для иллюстрации давайте воспользуемся объектом, который представляет соединение с базой данных и содержит методы по имени Commit (фиксация) и Rollback (откат).

Читать далее »

Обзор синтаксиса операторов try, catch и finally

Код внутри блока try защищен от исключений так, что если исключение сгенерировано, то исполняющая система ищет подходящий блок catch, чтобы его обработать. Независимо от того, существует или нет подходящий блок catch, если предусмотрен блок finally, он всегда выполняется, независимо от того, как поток управления покидает блок try.

Читать далее »

Исключения, сгенерированные в блоке finally, финализаторах

Возможно, но крайне нежелательно, генерировать исключения внутри блока finally. Следующий код демонстрирует пример: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using System; using System.Collections; public class Entrypoint { static void Main() { try { try { ArrayList list = new ArrayList […]

Читать далее »

Изменения, касающиеся необработанных исключений, которые появились в .NET 2.0

Когда исключение сгенерировано, исполняющая система начинает искать в стеке соответствующий этому исключению блок catch. Проходя по стеку, она раскручивает его, очищая по пути каждый фрейм. Если поиск завершается в последнем фрейме потока, а обработчик исключения не найден, в этой точке исключение считается необработанным. Что случится дальше — зависит от того, какая версия .NET Framework используется […]

Читать далее »

Исключения, сгенерированные в статических конструкторах

Если исключение сгенерировано, а в стеке нет обработчика, поэтому его поиск завершается в статическом конструкторе типа, то исполняющая система обрабатывает этот случай специальным образом. Она транслирует исключение в System. TypelnitializationException и генерирует его взамен первоначального.

Читать далее »

Завершение потоков в C#

При вызове Thread.Abort рассматриваемый поток, в конце концов, получает ThreadAbortException. Поэтому, естественно, для аккуратного обслуживания этой ситуации необходимо обрабатывать исключение ThreadAbortException, если поток должен делать что-то особенное в случае его прерывания.

Читать далее »

Повторная генерация и трансляция исключений

Внутри определенного фрейма стека может понадобиться перехватить все исключения или же определенное их подмножество, выполнить некоторую очистку и затем заново сгенерировать исключение, чтобы позволить ему дальше распространяться по стеку. Для реализации сказанного используется оператор throw без параметров:

Читать далее »
 
Rambler's Top100