«Машины должны работать. Люди должны думать»
34. Предопределенные обработчики исключительных ситуаций
Ниже Вы найдете справочную информацию по предопределенным исключениям, необходимую для профессионального программирования в Delphi.
Exception - базовый класс-предок всех обработчиков исключительных ситуаций.
EComponentError - вызывается в двух ситуациях:
· при попытке регистрации компоненты за пределами процедуры Register;
· когда имя компоненты не уникально или не допустимо.
EConvertError - происходит в случае возникновения ошибки при выполнении функций StrToInt и StrToFloat, когда конвертация строки в соответствующий числовой тип невозможна.
EInOutError - происходит при ошибках ввода/вывода при включенной директиве {$I+}.
EIntError - предок исключений, случающихся при выполнении целочисленных операций.
EDivByZero - вызывается в случае деления на ноль, как результат RunTime Error 200.
EIntOverflow - вызывается при попытке выполнения операций, приводящих к переполнению целых переменных, как результат RunTime Error 215 при включенной директиве {$Q+}.
ERangeError - вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+}.
EInvalidCast - происходит при попытке приведения переменных одного класса к другому классу, несовместимому с первым (например, приведение переменной типа TListBox к TMemo).
EInvalidGraphic - вызывается при попытке передачи в LoadFromFile файла, несовместимого графического формата.
EInvalidGraphicOperation - вызывается при попытке выполнения операций, неприменимых для данного графического формата (например, Resize для TIcon).
EInvalidObject - реально нигде не используется, объявлен в Controls.pas.
EInvalidOperation - вызывается при попытке отображения или обращения по Windows-обработчику (handle) контрольного элемента, не имеющего владельца (например, сразу после вызова MyControl:=TListBox.Create(...) происходит обращение к методу Refresh).
EInvalidPointer - происходит при попытке освобождения уже освобожденного или еще неинициализированного указателя, при вызове Dispose(), FreeMem() или деструктора класса.
EListError - вызывается при обращении к элементу наследника TList по индексу, выходящему за пределы допустимых значений (например, объект TStringList содержит только 10 строк, а происходит обращение к одиннадцатому).
EMathError - предок исключений, случающихся при выполнении операций с плавающей точкой.
EInvalidOp - происходит, когда математическому сопроцессору передается ошибочная инструкция. Такое исключение не будет до конца обработано, пока Вы контролируете сопроцессор напрямую из ассемблерного кода.
EOverflow - происходит как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205.
EUnderflow - происходит как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует RunTime Error 206.
EZeroDivide - вызывается в результате деления на ноль.
EMenuError - вызывается в случае любых ошибок при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников.
EOutlineError - вызывается в случае любых ошибок при работе с TOutLine и любыми его наследниками.
EOutOfMemory - происходит в случае вызовов New(), GetMem() или конструкторов классов при невозможности распределения памяти. Соответствует RunTime Error 203.
EOutOfResources - происходит в том случае, когда невозможно выполнение запроса на выделение или заполнение тех или иных Windows ресурсов (например таких, как обработчики - handles).
EParserError – вызывается, когда Delphi не может произвести разбор и перевод текста описания формы в двоичный вид (часто происходит в случае исправления текста описания формы вручную в IDE Delphi).
EPrinter - вызывается в случае любых ошибок при работе с принтером.
EProcessorException - предок исключений, вызываемых в случае прерывания процессора - hardware breakpoint. Никогда не включается в DLL, может обрабатываться только в “цельном” приложении.
EBreakpoint - вызывается в случае останова на точке прерывания при отладке в IDE Delphi. Среда Delphi обрабатывает это исключение самостоятельно.
EFault - предок исключений, вызываемых в случае невозможности обработки процессором тех или иных операций.
EGPFault - вызывается, когда происходит “общее нарушение защиты” - General Protection Fault. Соответствует RunTime Error 216.
EInvalidOpCode - вызывается, когда процессор пытается выполнить недопустимые инструкции.
EPageFault - обычно происходит как результат ошибки менеджера памяти Windows, вследствие некоторых ошибок в коде Вашего приложения. После такого исключения рекомендуется перезапустить Windows.
EStackFault - происходит при ошибках работы со стеком, часто вследствие некорректных попыток доступа к стеку из фрагментов кода на ассемблере. Компиляция Ваших программ со включенной проверкой работы со стеком {$S+} помогает отследить такого рода ошибки.
ESingleStep - аналогично EBreakpoint, это исключение происходит при пошаговом выполнении приложения в IDE Delphi, которая сама его и обрабатывает.
EPropertyError - вызывается в случае ошибок в редакторах свойств, встраиваемых в IDE Delphi. Имеет большое значение для написания надежных редакторов свойств. Определен в модуле DsgnIntf.pas.
EResNotFound - происходит в случае тех или иных проблем, имеющих место при попытке загрузки ресурсов форм - файлов .DFM в режиме дизайнера. Часто причиной таких исключений бывает нарушение соответствия между определением класса формы и ее описанием на уровне ресурса (например,вследствие изменения порядка следования полей-ссылок на компоненты, вставленные в форму в режиме дизайнера).
EStreamError - предок исключений, вызываемых при работе с потоками.
EFCreateError - происходит в случае ошибок создания потока (например, при некорректном задании файла потока).
EFilerError - вызывается при попытке вторичной регистрации уже зарегистрированного класса (компоненты). Является, также, предком специализированных обработчиков исключений, возникающих при работе с классами компонент.
EClassNotFound - обычно происходит, когда в описании класса формы удалено поле-ссылка на компоненту, вставленную в форму в режиме дизайнера. Вызывается, в отличие от EResNotFound, в RunTime.
EInvalidImage - вызывается при попытке чтения файла, не являющегося ресурсом, или разрушенного файла ресурса, специализированными функциями чтения ресурсов (например, функцией ReadComponent).
EMethodNotFound - аналогично EClassNotFound, только при несоответствии методов, связанных с теми или иными обработчиками событий.
EReadError - происходит в том случае, когда невозможно прочитать значение свойства или другого набора байт из потока (в том числе ресурса).
EFOpenError - вызывается когда тот или иной специфированный поток не может быть открыт (например, когда поток не существует).
EStringListError - происходит при ошибках работы с объектом TStringList (кроме ошибок, обрабатываемых TListError).
Исключения, возникающие при работе с базами данных.
Delphi, обладая прекрасными средствами доступа к данным, основывающимися на интерфейсе IDAPI, реализованной в виде библиотеки Borland Database Engine (BDE), включает ряд обработчиков исключительных ситуаций для регистрации ошибок в компонентах VCL работающим с БД. Дадим краткую характеристику основным из них:
EDatabaseError - наследник Exception – происходит при ошибках доступа к данным в компонентах-наследниках TDataSet. Этот класс объявлен в модуле DB. Ниже приведен пример из Delphi On-line Help, посвященный этому исключению:
repeat {пока не откроем таблицу или не нажмем кнопку Cancel}
try
Table1.Active := True; {Пытаемся открыть таблицу}
Break; { Если нет ошибки - прерваем цикл}
except
on EDatabaseError do
{Если нажата OK - повторяем попытку открытия Table1}
if MessageDlg('Не могу открыть Table1', mtError, [mbOK, mbCancel], 0) <> mrOK then raise;
end;
until False;
EDBEngineError - наследник EDatabaseError; вызывается, когда происходят ошибки BDE или сервера БД. Объявлен в модуле DB:
EDBEngineError = class(EDatabaseError)
private
FErrors: TList;
function GetError(Index: Integer): TDBError;
function GetErrorCount: Integer;
public
constructor Create(ErrorCode: DBIResult);
destructor Destroy;
property ErrorCount: Integer;
property Errors[Index: Integer]: TDBError;
end;
Особенно важны два свойства класса EDBEngineError :
Errors - список всех ошибок, находящихся в стеке ошибок BDE. Индекс первой ошибки 0;
ErrorCount - количество ошибок в стеке.
Объекты, содержащиеся в Errors, имеют тип TDBError. Доступные свойства класса TDBError:
ErrorCode - код ошибки, возвращаемый Borland Database Engine;
Category - категория ошибки, описанной в ErrorCode;
SubCode - 'субкод' ошибки из ErrorCode;
NativeError - ошибка, возвращаемая сервером БД. Если NativeError=0, то ошибка в ErrorCode не от сервера;
Message - сообщение, переданное сервером, если NativeError<>0 или сообщение BDE - в противном случае.
EDBEditError - наследник Exception; вызывается, когда данные не совместимы с маской ввода, наложенной на поле. Объявлен в модуле Mask.
«33. Дополнительные возможности обработки ИС»
35. Динамически подключаемые библиотеки