Справочное руководство по Delphi

       

Доступ к экземпляру объекта exception


  • До сих пор мы рассматривали механизмы защиты кода и ресурсов, логику работы программы в исключительной ситуации. Теперь нужно немного разобраться с тем, как же обрабатывать возникшую ошибку. А точнее, как получить дополнительную информацию о коде ошибки, текст сообщения и т.п.
  • Как уже говорилось, при вызове исключительной ситуации (raise) автоматически создается экземпляр соответствующего класса, который и содержит информацию об ошибке. Весь вопрос в том, как в обработчике данной ситуации получить доступ к этому объекту.

    Рассмотрим модифицированную процедуру A в нашем примере:

    procedure NewA;

    begin

    writeln('Enter A');

    try

    writeln('Enter A''s try block');

    B;

    writeln('After B call');

    except

    on E: ESampleError do writeln(E.Message);

    on ESomethingElse do



    writeln('Inside A''s ESomethingElse handler');

    end;

    writeln('Exit A');

    end;

    Здесь все изменения внесены в строку

    on ESE: ESampleError do writeln(ESE.Message);

    Пример демонстрирует еще одно новшество в языке Object Pascal - создание локальной переменной. В нашем примере локальной переменной является ESE - это тот самый экземпляр класса ESampleError, который был создан в процедуре C в момент вызова исключительного состояния. Переменная ESE доступна только внутри блока do. Свойство Message объекта ESE содержит сообщение, которое было передано в конструктор Create в процедуре C.

    Есть еще один способ доступа к экземпляру exception - использовать функцию ExceptionObject:

    on ESampleError do

    writeln(ESampleError(ExceptionObject).Message);

  • Предопределенные обработчики исключительных ситуаций
  • Ниже Вы найдете справочную информацию по предопределенным исключениям, необходимую для профессионального программирования в Delphi.

    •  
    • Exception - базовый класс-предок всех обработчиков исключительных ситуаций.
      •  
      • EAbort - “скрытое” исключение. Используйте его тогда, когда хотите прервать тот или иной процесс с условием, что пользователь программы не должен видеть сообщения об ошибке. Для повышения удобства использования в модуле SysUtils предусмотрена процедура Abort, определенная, как:

      • procedure Abort;

        begin

        raise EAbort.CreateRes(SOperationAborted) at ReturnAddr;

        end;



        •  


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




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


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



          •  


          • 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.




                                          •  


                                          • Underflow - происходит как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует 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. Имеет большое значение для написания надежных property editors. Определен в модуле DsgnIntf.pas.




                                                                                    •  


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




                                                                                      •  


                                                                                      • EStreamError - предок исключений, вызываемых при работе с потоками.




                                                                                        •  


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




                                                                                          •  


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








                                                                                              •  


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






                                                                                                  •  


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






                                                                                                      •  


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






                                                                                                          •  


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






                                                                                                              •  


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




                                                                                                                •  


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








                                                                                                                      1.  


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


                                                                                                                      3. 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.









                                                                                                                                  1. Содержание раздела