logo search
Программирование в среде Delphy / Программирование в среде Delphi

19.3. Основные исключительные ситуации

Приведем список основных исключительных ситуаций:

• Exception – базовый класс–предок всех обработчиков исключительных ситуаций;

• EAbort – «скрытое» исключение. Его используют тогда, когда нужно прервать процесс с условием, что пользователь программы не должен видеть сообщения об ошибке. Для удобства использования в модуле SysUtils предусмотрена процедура Abort;

• EComponentError – вызывается в двух ситуациях:

1) при попытке регистрации компонента за пределами процедуры Register;

2) когда имя компоненты не уникально или не допустимо;

• EConvertError – происходит в случае возникновения ошибки при выполнении функций StrToInt и StrToFloat, когда конвертация строки в соответствующий числовой тип невозможна;

• EInOutError – происходит при ошибках ввода/вывода при включенной директиве {$I+};

• EIntError – предок исключений, случающихся при выполнении целочисленных операций:

1) EDivByZero – вызывается в случае деления на ноль, как результат RunTime Error 200;

2) EIntOverflow – вызывается при попытке выполнения операций, приводящих к переполнению целых переменных как результат RunTime Error 215 при включенной директиве {$Q+};

3) ERangeError – вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+};

o EInvalidCast – происходит при попытке приведения переменных одного класса к другому классу, не совместимому с первым (например, приведение переменной типа TListBox к TMemo);

o EInvalidGraphic – вызывается при попытке передачи в LoadFromFile файла, несовместимого графического формата.

o EInvalidGraphicOperation – вызывается при попытке выполнения операций не применимых для данного графического формата (например, Resize для TIcon);

o EInvalidObject – реально нигде не используется, объявлен в Controls.pas;

o EInvalidOperation – вызывается при попытке отображения или обращения по Windows–обработчику (handle) контрольного элемента, не имеющего владельца (например, сразу после вызова MyControl:=TListBox.Create(...) происходит обращение к методу Refresh);

o EInvalidPointer – происходит при попытке освобождения уже освобожденного или еще не инициализированного указателя при вызове Dispose(), FreeMem() или деструктора класса;

o EListError – вызывается при обращении к элементу наследника TList по индексу, выходящему за пределы допустимых значений (например, объект TStringList содержит только 10 строк, а происходит обращение к одиннадцатой строке);

o MathError – предок исключений, случающихся при выполнении операций с плавающей точкой:

1) EInvalidOp – происходит, когда математическому сопроцессору передается ошибочная инструкция. Такое исключение не будет до конца обработано, пока Вы контролируете сопроцессор напрямую из ассемблерного кода;

2) EOverflow – происходит как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205;

3) Underflow – происходит как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует RunTime Error 206;

4) EZeroDivide – вызывается в результате деления на ноль;

o EMenuError – вызывается в случае любых ошибок при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников;

o EOutlineError – вызывается в случае любых ошибок при работе с TOutLine и любыми его наследниками;

o EOutOfMemory – происходит в случае вызовов New(), GetMem() или конструкторов классов при невозможности распределения памяти. Соответствует RunTime Error 203;

o EOutOfResources – происходит в том случае, когда невозможно выполнение запроса на выделение или заполнение тех или иных Windows ресурсов (например таких, как обработчики – handles);

o EParserError – вызывается когда Delphi не может произвести разбор и перевод текста описания формы в двоичный вид (часто происходит в случае исправления текста описания формы вручную в IDE Delphi);

o EPrinter – вызывается в случае любых ошибок при работе с принтером.

o EProcessorException – предок исключений, вызываемых в случае прерывания процессора – hardware breakpoint. Никогда не включается в DLL, может обрабатываться только в «цельном» приложении.

1) EBreakpoint вызывается в случае останова на точке прерывания при отладке в IDE Delphi. Среда Delphi обрабатывает это исключение самостоятельно;

2) EFault – предок исключений, вызываемых в случае невозможности обработки процессором тех или иных операций;

EGPFault – вызывается, когда происходит «общее нарушение защиты» – General Protection Fault. Соответствует RunTime Error 216;

EInvalidOpCode – вызывается, когда процессор пытается выполнить недопустимые инструкции;

EPageFault – обычно происходит как результат ошибки менеджера памяти Windows, вследствие некоторых ошибок в коде вашего приложения. После такого исключения рекомендуется перезапустить Windows;

EStackFault – происходит при ошибках работы со стеком, часто вследствие некорректных попыток доступа к стеку из фрагментов кода на ассемблере. Компиляция ваших программ со включенной проверкой работы со стеком {$S+} помогает отследить такого рода ошибки;

3) ESingleStep – аналогично EBreakpoint, это исключение происходит при пошаговом выполнении приложения в IDE Delphi, которая сама его и обрабатывает;

o EPropertyError – вызывается в случае ошибок в редакторах свойств, встраиваемых в IDE Delphi. Имеет большое значение для написания надежных property editors. Определен в модуле DsgnIntf.pas;

o EResNotFound – происходит в случае тех или иных проблем, имеющих место при попытке загрузки ресурсов форм – файлов .DFM в режиме дизайнера. Часто причиной таких исключений бывает нарушение соответствия между определением класса формы и ее описанием на уровне ресурса (например, вследствие изменения порядка следования полей–ссылок на компоненты, вставленные в форму в режиме дизайнера);

o EStreamError – предок исключений, вызываемых при работе с потоками;

1) EFCreateError – происходит в случае ошибок создания потока (например, при некорректном задании файла потока).

2) EFilerError – вызывается при попытке вторичной регистрации уже зарегистрированного класса (компонента). Является также предком специализированных обработчиков исключений, возникающих при работе с классами компонентов;

EClassNotFound – обычно происходит, когда в описании класса формы удалено поле–ссылка на компонент, вставленный в форму в режиме дизайнера. Вызывается, в отличие от EResNotFound, в RunTime;

EInvalidImage – вызывается при попытке чтения файла, не являющегося ресурсом, или разрушенного файла ресурса специализированными функциями чтения ресурсов (например, функцией ReadComponent);

EMethodNotFound – аналогично EClassNotFound, только при несоответствии методов, связанных с теми или иными обработчиками событий;

EReadError – происходит в том случае, когда невозможно прочитать значение свойства или другого набора байт из потока (в том числе ресурса);

3) EFOpenError – вызывается, когда тот или иной специфированный поток не может быть открыт (например, когда поток не существует);

o EStringListError – происходит при ошибках работы с объектом TStringList (кроме ошибок, обрабатываемых TListError).

Среда Delphi по умолчанию перехватывает все возникающие исключительные ситуации. Но в случае проверки правильности обработки в вашей программе исключительных ситуаций следует в меню Tools/Debugging Options… отключить флаг Stop On Delphi Exceptions, и тогда среда Delphi перестанет реагировать на исключительные ситуации, возникающие в отлаживаемой программе.

Для целей отладки программы в Delphi имеется процедура

Procedure Assert(Key:Boolean [; const msg:String]);

Ей соответствует исключительная ситуация EAsserttionFailed. При вызове этой функции проверяется значение параметра Key: если оно равно True, то ничего не происходит, а если – False, то возникает исключительная ситуация EAsserttionFailed. Стандартный обработчик этой ситуации показывает в диалоговом окне имя файла с исходным текстом и номер строки, где произошла исключительная ситуация. Включение и отключение этой исключительной ситуации можно осуществлять директивой компилятора {$C+} или {$C-}.