Сгенерировать ошибку delphi

I’m asking for Delphi native, not Prism(net).

This is my code:

raise Exception.Create('some test');

Undeclared identifier «Exception».

Where’s the problem, how do I throw/raise exceptions?

w5m's user avatar

w5m

2,2863 gold badges34 silver badges46 bronze badges

asked Jul 13, 2009 at 10:08

Ivan Prodanov's user avatar

Ivan ProdanovIvan Prodanov

34.7k78 gold badges176 silver badges248 bronze badges

The exception class «Exception» is declared in the unit SysUtils. So you must add «SysUtils» to your uses-clause.

uses
  SysUtils;

procedure RaiseMyException;
begin
  raise Exception.Create('Hallo World!');
end;

answered Jul 13, 2009 at 10:12

Andreas Hausladen's user avatar

3

Remember to add SysUtils to your uses units.

I also suggest below a nice way to keep track of categories, formats of messages and meaning of exception:

Type TMyException=class
public
  class procedure RaiseError1(param:integer);
  class procedure RaiseError2(param1,param2:integer);
  class procedure RaiseError3(param:string);
end;

implementation

class procedure TMyException.RaiseError1(param:integer);
begin
  raise Exception.create(format('This is an exception with param %d',[param]));
end;

//declare here other RaiseErrorX

A simple way of using this is:

TMyException.RaiseError1(123);

w5m's user avatar

w5m

2,2863 gold badges34 silver badges46 bronze badges

answered Jul 14, 2009 at 15:27

Marco's user avatar

3

You may need to add sysutils to the uses clause, it is not built in and is optional according to Delphi in a nutshell.

answered Jul 13, 2009 at 10:11

RobS's user avatar

RobSRobS

3,80727 silver badges34 bronze badges

You are using SysUtils aren’t you? Exception is declared in there IIRC.

answered Jul 13, 2009 at 10:11

Will's user avatar

WillWill

74k40 gold badges170 silver badges246 bronze badges

For some of my procedures and functions, I have implemented various checks on parameters in order to force execution to stop if parameters are out of range in one way or another.
I find it better to check for this in my own code rather than have an abnormal crash due to a perhaps bad memory-write.

Consider the simple code:

PROCEDURE Test(OneDigitNumbers:BYTE);
BEGIN
  IF OneDigitNumbers>9 THEN ProduceErrorMessage;
END;

begin
  Test( 1);
  Test( 2);
  Test( 9);
  Test(12);
end.

I have no problem in actually producing an error message, my only «problem» is that the debugger in Delphi always point to the procedure creating the exception.
Is there a method of creating this exception or error message so that the debugger point to the line where the parameter is out of range?
In my example, it should point to :

Test(12);

and maybe say something like «Parameter out of range. Valid range is 0-9. Parameter passed was: 12»

Even an answer to say that this is NOT possible will be useful (if you know for sure that this is not possible), because then I will just forget about this and make an alternative method for debugging.

asked Apr 14, 2013 at 7:50

Morten Brendefur's user avatar

21

To answer the question as asked, you can make the test function inline:

procedure Test(OneDigitNumbers: byte); inline;

The compiler will then write the code for Test into each calling function. Whilst you can do this, my advice is that you do not. It’s just a trick but I don’t think it really helps you.

If you want to raise the exception at the return address, you can do this:

raise Exception.CreateFmt(
  'Exception blah blah at %p.',
  [ReturnAddress]
) at ReturnAddress;

If you want to go further up the stack, then you’ll have to use something like CaptureStackBackTrace. Combine the back trace with raise at and you can raise the exception at any point in the call stack, if really you think that’s a good idea. I do not think it’s a good idea, as I explain below.

If you use a good debugging tool, like madExcept, then the call stacks in the madExcept bug reports will tell you all you need to know when an error occurs.


With the extra clarification in the comments, it seems that what you really want to happen is for the exception to contain information from higher up the call stack. To my mind it is a violation of encapsulation to ask the callee to report information about its caller. So if you want to include information from the caller, let the caller catch the exception, add the information, and re-raise.

answered Apr 14, 2013 at 8:18

David Heffernan's user avatar

David HeffernanDavid Heffernan

602k42 gold badges1076 silver badges1491 bronze badges

10

You’re looking for a subrange type.

type
  TOneDigitNumber = 0..9;

procedure Test(OneDigitNumbers: TOneDigitNumber);
begin
  // Do something
end;

begin
  Test( 1);
  Test( 2);
  Test( 9);
  Test(12);   // compiler error '[DCC Error] MyStuffTest.pas(33): E1012 Constant expression violates subrange bounds
end.

answered Apr 14, 2013 at 8:00

Ken White's user avatar

Ken WhiteKen White

123k14 gold badges225 silver badges445 bronze badges

4

A bit of an elaboration on my comment to your question

type
  EMyOwnRangeError = class(ERangeError)
    // You can also add your own member variables for easier inspection
  public
    constructor CreateFrom(const aRangeError: ERangeError);
  end;

constructor EMyOwnRangeError.CreateFrom(const aRangeError: ERangeError);
begin
  // Do whatever you need to inspect the call stack in aRangeError 
  // and modify the message and/or set any extra member variable that you
  // you define on EMyOwnRangeError.
  // No help from me on this, quite simply because I don't have Delphi 
  // installed on the machine I am currently working at.
end;

procedure MySpecialTest(const aWhatever: Byte);
begin
  try
    if (aWhatever < 0) or (aWhatever > SOMEUPPERRANGE) then
      raise ERangeError.Create;

    // Normal code for MySpecialTest

  except
    on E: ERangeError do raise EMyOwnRangeError.CreateFrom(E);
    else
      raise; // Make sure other exceptions are propagated.
  end;
end;

answered Apr 14, 2013 at 9:17

Marjan Venema's user avatar

Marjan VenemaMarjan Venema

19.1k6 gold badges66 silver badges79 bronze badges

I have now tested basically the approach in the idea I got from David Heffernan.
I simply added this simple code in one of my units of reuseables:

PROCEDURE TestError(Par:BYTE);
  BEGIN
    TRY
    FINALLY
      IF Par>9 THEN Raise Exception.CreateFmt('Error Blah blah blah at ',[Par]) AT @Par;
    END;
  END;

When this procedure is called with a parameter higher than 9 then it forces an exception.
Delphi ask «Break or Continue» and I click Break.

The result is almost what I would like, but it is so close that I can live with that.
The debugger pops up with a nice red line on the line AFTER the one calling the procedure.

I tried withouth the TRY-Finally-End also, and then it is plain wrong, actually showing the red line another level back from the callstack..

Anyway. I feel that this result is an awful lot better than what I had before. Now my debugging will be a joy rather than a pain.
Thank you :)

answered Apr 14, 2013 at 17:02

Morten Brendefur's user avatar

5

Разрабатывая какое-нибудь приложение, вы должны написать код. который будет решать поставленную задачу, а также код, который будет выполнять проверку на наличие ошибок. Как правило, код для обработки ошибок строится на основе оператора if.

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

С задачей перехвата ошибок и реагирования на них лучше всего справляется механизм обработки исключений. Если в приложении, написанном с помощью Delphi, возникает ошибка, то приложение автоматически генерирует исключение. Исключением представляет собой объект, который описывает возникающую ошибку. 

Генерация исключения означает всего лишь то. что приложение создало объект исключения и максимально подробно описало ошибку.

Если мы не обрабатываем исключение (то есть не приготовлен специальный код для перехвата исключения), приложение само сделает это автоматически. Обычно приложение обрабатывает исключение, выводя на экран монитора окно с сообщением о возникшей ошибке. Например, если вы передадите функции StrToInt строку, содержащую символы, которые не могут быть преобразованы в числовое значение, или вообще пустую строку, то функция сгенерирует исключение (рис. 13.1). 

Рис. 13.1. Исключение, обработанное приложением 

Чтобы обработать исключение, сгенерированное функцией StrToInt, мы должны поместить вызов функции StrToInt в защищенный блок кода. Защищенным является блок кода, который может реагировать на некоторое исключение. В Delphiзащищенный блок выглядит следующим образом: 

 

Операторы, которые могут сгенерировать исключение, записываются в блоке try, а в обработчике исключений пишется код, который занимается обработкой исключений. Обработчик исключения является частью защищенного блока, начинающегося с зарезервированного слова except в Delphi. 

Если вы передадите функции StrToInt допустимую строку, и при этом исключение не возникнет, будет выполнен только тот код, который находится в блоке try. Код в блоке исключения выполняется только в том случае, если оператор, находящийся Внутри этого блока, сгенерирует исключение.

В следующих двух примерах показано, как осуществляется вызов функции StrToInt и перехват исключения, которое может быть сгенерировано этой функцией (рис. 13.2). В листинге 13.1А показан пример перехвата исключений в приложениях, написанных с помощью Delphi.

Листинг 13.1А. Перехват исключения в Delphi

Теперь давайте попытаемся создать простой калькулятор, с помощью которого можно будет делить числа. Интерфейс пользователя этой небольшой программы показан на рис. 13.3.

Чтобы разделить значения, введенные в компонентах TEdit, мы должны написать код, который сначала преобразует их в целые числа, а затем разделит одно на другое. Этот код может легко сгенерировать два исключения.

Одно из них, EConvertError, может быть сгенерировано в том случае, если значение одного из компонентов TEdit невозможно преобразовать к целому типу, а другое. EDivByZero, может быть сгенерировано тогда, когда предпринимается попытка разделить первое число на 0.

Листинг 13.2. Деление двух чисел

Несмотря на то что вы можете написать обработчики для перехвата всех исключений, вы должны постараться обрабатывать только специфические исключения. Обработать специфическое исключение можно с помощью зарезервированного слова on. с которым связан следующий синтаксис:

on Некоторое_Исключение do Обработка_Исключения;

Конструкцию on-do можно использовать только в рамках обработчика исключений:

По мере возможности, для обработки различных исключений лучше использовать конструкцию on-do. Например, вы можете обработать исключение EConvertError, выводя сообщение об ошибке, а исключение EDivByZero — уведомляя пользователя о том. что второе число не может быть равно нулю, и автоматически заменяя его единицей. В листинге 13.ЗА показан пример обработки специфических исключений в Delphi.

Листинг 13.3А. Обработка специфических исключений

Если конструкцию on-do использовать для обработки специфических исключений, вы должны также написать код для обработки ошибок, о которых вам ничего не будет известно. Чтобы обработать исключения, которые вам не удастся обработать специфическим образом, можно добавить к обработчику исключения часть else.

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

Например, следующий обработчик исключения обрабатывает только исключение EConvertError. Как только возникнет какое-то другое исключение, обработчик исключения сгенерирует его повторно. В итоге исключение останется «в силе» после завершения работы обработчика, и будет передано на обработку уже другому обработчику, который обычно используется по умолчанию. В листинге 13.4А показан пример повторного вызова исключения в Delphi.

Листинг 13.4А. Повторная генерация исключения в Delphi

Итак, если будет сгенерировано исключение EConvertError. то обработчик справится с ним самостоятельно, а если возникнет любое другое исключение, скажем. EDivByZero или EAccessViolation. то обработчик сгенерирует его повторно и направит его другому обработчику (рис. 13.4).

Зарезервированное слово raise используется также и для генерации исключения. Чтобы сгенерировать исключение в Delphi, используйте зарезервированное слово raise, указывая вслед за ним экземпляр объекта исключения. Экземпляром объекта исключения обычно является вызов конструктора исключения. 

Синтаксис генерации исключения обычно выглядит следующим образом:

Вы можете, например, создать специальный вариант функции StrToInt, которая будет генерировать исключение EConvertError с помощью специальных сообщений об ошибке, если строку нельзя будет преобразовать в целое число. В листинге 13.5А представлена версия этой функции в Delphi.

Листинг 13.5А. Генерация исключений в Delphi

Конструкция оп-с!о позволяет получать на время объект исключения с помощью следующего синтаксиса:

В качестве идентификатора обычно применяется заглавная буква Е. Когда вы получаете объект исключения, вы можете использовать его подобно любому другому объекту и даже обращаться к его свойствам и методам. Единственное, что не рекомендуется делать, это уничтожать объект исключения, поскольку объекты исключения автоматически управляются обработчиком исключения. На рис. 13.6 показан результат использования объекта исключения.

В качестве идентификатора обычно применяется заглавная буква Е. Когда вы получаете объект исключения, вы можете использовать его подобно любому другому объекту и даже обращаться к его свойствам и методам. Единственное, что не рекомендуется делать, это уничтожать объект исключения, поскольку объекты исключения автоматически управляются обработчиком исключения. На рис. 13.6 показан результат использования объекта исключения.

Листинг 13.6. Использование объекта исключения

Создать специальное исключение несложно, и этот процесс ничем не отличается от создания специального класса. Специальные исключения должны порождаться от класса Exception или другого потомка этого класса. Имена классов исключений должны начинаться с заглавной буквы Е.

В листинге 13.7А показана генерация и перехват специального исключения в Delphi. На рис. 13.7 можно видеть результат работы со специальным исключением.

Листинг 13.7А. Работа со специальным исключением

Зарезервированное слово try позволяет построить два различных блока: блок обработчика исключений и блок защиты ресурсов. Блок обработчика исключений создается с помощью зарезервированного слова except, а блок защиты ресурсов— с помощью зарезервированного слова finally. Синтаксическая структура блока защиты ресурсов в Delphi выглядит следующим образом:

 

Блоки обработки исключений и защиты ресурсов используются по-разному и работают тоже по-разному. Операторы обработчика исключений выполняются только в том случае, если операторы в блоке try сгенерировали исключение, а операторы в блоке finally выполняются всегда, даже если операторы в блоке try не сгенерировали никакого исключения. Если в блоке try возникнет исключение, управление будет передано блоку finally, после чего будет выполнен код очистки. Если в блоке try исключения не возникнут, операторы в блоке finally будут выполняться после операторов в блоке try.

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

Блок защиты ресурса часто используется для того, чтобы обеспечить надлежащее освобождение динамически созданных объектов. Например, динамическое создание модальной формы необходимо всегда защищать с помощью блока try-finally (см. листинг 13.8).

Листинг 13.8. Динамическое создание формы с защитой ресурса, версий Delphi

 

В листинге 13.9 представлен более короткий способ динамического создания формы, защищенной блоком try-finally:

 

Другое отличие между блоками обработки исключений и блоками обработки ресурсов заключается в том, что блок обработки ресурсов не обрабатывает исключения. Таким образом, если исключение возникнет, оно будет передано первому доступному обработчику исключений. Например, если вы выполните следующий код. то исключение EDivByZero приведет к тому, что обработчик исключений, используемый по умолчанию, выведет на экран монитора сообщение об ошибке, информирующее пользователя о возникшем исключении.

 

Если вы хотите обработать исключение EDivByZero (или любое другое исключение) внутри блока защиты ресурсов, вы должны написать вложенный блок обработчика исключений. О вложенных блоках читайте в этой статье: Вложенные блоки

Помоги проекту! Расскажи друзьям об этом сайте:

Помогаю со студенческими работами здесь

Как сгенерировать исключение отличное от стандартного
Есть специальный метод который генерирует исключение если запись не найдена
$article =…

Сгенерировать простое исключение в свойстве
В классе Сlass1 есть переменная int _RegNumber, (и еще одна переменная для имени организации,…

Сгенерировать исключение, если в текстбоксе есть цифры
Пишу программу и не могу разобраться… Суть программы я заполняю информацию о человеке ( его ФИО,…

Можно ли как-то искусственно вызвать существующее событие, или как-то на него подписаться?
Можно ли из кода как-то напрямую вызвать определенное событие? Т.е. нужно, чтобы сработал…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

Обработка исключительных ситуаций

Как возникают
исключительные ситуации?

Существует множество
источников исключительных ситуаций.
Например, программой могут быть
сгенерированны исключения из-за какого-то
ненормального состояния. Исключения
генерируются компонентами Delphi для
различных событий, таких как присвоение
свойству значения, выходящего за
допустимые пределы, или попытка
индексировать несуществующий элемент
массива.

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

Вот некоторые типы
операций, которые могут привести к
исключительным ситуациям:

  • обработка файла;

  • выделение памяти;

  • работа с ресурсами
    системы;

  • работа с объектами и
    формами, создаваемыми во время
    выполнения программы;

  • аппаратные конфликты и
    конфликты операционных систем.

Ключевые слова,
используемые для обработки исключительных
ситуаций.

В Object Pascal есть
несколько ключевых слов для создания и
обработки исключений. Это try, except, on-do-else, finally,
raise и at.

Блоки защищенных
опереаторов

Блок защищенных
операторов —  основное средство для
обработки исключительных ситуация. Ниже
показана схема создания блока защищенных
операторов с помощью блоков try и except.
Обратите внимание, что конструкция
заканчивается ключевым словом end;

try

{операторы, которые могут вызвать
ошибку(сгенерировать исключение)}

except

{опереаторы для обработки
сгенерированных исключений}

end; 

Этот пример демонстрирует
возникновение исключительной ситуации
при делении на ноль.

procedure TForm1.Button1Click(Sender: TObject);
Var
   I, J, K: integer;
begin
   I:=0;
   J:=10;
  try
     K := J div I;
     showmessage(inttostr(k));
  except
     Showmessage (‘Ошибка! Деление на ноль.’);
  end;
end;

!

 Внимание! При
тестировании исключительных ситуаций
желательно отключить утилиту
отслеживания сообщений WinSight32, если она
запущена. Также, если вы используете Delphi
4, выберите команду Tools => Debugger Options и на
вкладке Language Exception снимите флажок Stop on
Delphi Exception.
Теперь исключения не будут
отлавливаться средой Delphi и управление
исключительными ситуациями полностью
предается вашему приложения.

  • После возникновения исключительной
    ситуации в блоке try выполнение
    немедленно переходит к первому оператору
    блока except. После генерирования
    исключительной ситуации дальнейшие
    операторы блока try не выполняются.

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

Блоки защищенных ресурсов

Вывод сообщений об ошибке — это только
один аспект обработки исключительных
ситуаций. Устойчивое приложение должно
восстанавливать стабильное состояние
системы при возникновении аварийных
ситуаций. Для создания блоков защищенных
ресурсов используют блоки try и finally.

Схема создания блока защищенных
ресурсов:

try

{операторы, которые могут вызвать
ошибку(сгенерировать исключение)}

finally

{освободить ресурс; гарантированно
будет выполнено}

end;

{продолжить, если в блоке try не
возникло исключительных ситуаций} 

  • Операторы блока finally выполняются
    всегда, независимо от того, генерируется
    ли в блоке try исключение. Обычно
    операторы блока finally служат для
    освобождения памяти, закрытия файлов и
    выполнения других необходимых операций
    для восстановления стабильности системы
    при возникновении исключительной
    ситуации.

Пример использования блока защищенных
ресурсов:

procedure TForm1.Button1Click(Sender: TObject);
Var
   I, J, K: integer;

   P : Pointer;
begin
   I:=0;
   J:=10;

   getMem(P, 4098);  // Выделение
памяти
  try
     K := J div I;
     showmessage(inttostr(k));
  finally
     FreeMem(p, 4098); //Гарантированно
выполняется     

     Showmessage (‘Память
освобождена’);
  end;
end;

В данном случае память
освободится в любом случае. Независимо
от исключительных ситуаций (В данном
случае — деление на ноль)

В блоке finally не обрабатываются
исключительные ситуации — они могут быть
обработаны только в блоке except.
Операторы блока finally гарантированно
выполняются независимо от того, что
произошло в предыдущем блоке try.

Вложенные блоки try-except и try-finally

Схема создания смешанных блоков
защищенных операторов и защищенных
ресурсов:

{Выделение ресурса}

try

    try

      {операторы, которые могут вызвать
ошибку(сгенерировать исключение)}

    except

      {Операторы
обработки исключений}

    end;

finally

   {Освобождение реурса}

end;

Обработка определенных
исключений

 Пример:

  try
    {операция печати}

  finally

    on E: Eprinter do

       Showmessage(E.Message); //Вывести
сообщение об ошибке
  end;

В данном случае отлавливается именно
ошибка при печати (EPrinter).

Классы исключений:

  • Eabort — исключение генерируется при вызове
    процедуры аборт

  • EAccessViolation — Ошибка доступа

  • EArrayError — ошибка при работе с массивом

  • EBitsError — некорректная операция с
    логическими массивами

  • EConvertError — при ошибках преобразования
    типов данных

  • EDivByZerro — деление на ноль

  • EFCreateError. Указывает на ошибку при
    создании файла.

  • EFileError. Указывает на ошибку в операциях с
    файловым потоком.

  • EFopenError. Указывает на ошибку открытия
    файла.

  • EInOutError. Ошибка файлового ввода-вывода. В
    поле ErrorCode экземпляра исключения
    содержится код ошибки ввода-вывода. Эта
    исключительная ситуация может
    возникнуть, только если программа
    скомпилирована с директивой  {$I} (она
    используется по умолчанию). Коды ошибок
    следующие : 2 — файл не найден, 3 — неверное
    имя файла, 4 — слишком много открытых
    файлов, 5 — доступ запрещен, 100 — конец файла,
    101 — диск переполнен и 106 — некорректный
    ввод. Так же допустимы другие коды ошибок.

  • EIntError. Основной класс для математических
    ошибок при операциях с целыми числами.
    Обьекты этого класса исключений никогда
    не создаются, однако класс можно
    использовать для перехвата всех ошибок в
    целочисленных операциях. Для создания
    обьектов исключений используйте
    производные классы, такие как
    EDivByZero,ERangeError и EIntOverflow.

  • EIntfCastError. Генерируется при попытке
    некорректного приведения типов с
    использованием оператора as .

  • EIntOverflow. Переполнение для переменной
    типа Integer.

  • EInvalidArgument. Выходящие за допустимые рамки
    значение в специализированных
    математических и финансовых функциях из
    модуля Math.

  • EInvalidCast. Неверное выражение приведения
    типов.

  • EInvalid Graphic. Генерируется программой при
    попытке открытия нераспознаваемого
    графического файла (например, открытие по
    ошибке текстового файла вместо файла
    точечного изображения .bmp).

  • EInvalidGraphicOperation. Указывает на некорректную
    графическую операцию, такую как попутка
    изменить размер пиктограммы.

  • EInvalidGridOperation. Генерируется при
    некорректных операциях с компонентами grid,
    например при попытке обращения к
    несуществующей ячейке.

  • EInvalidOp. Указывает на некорректную
    операцию с плавающей запятой.
    Генерируется при неопределенных
    математических ошибках, например когда
    для прцессора передается
    неопределенная  инструкция,
    производится попытка выполнить
    некорректную операцию или переполняется
    стек процессора.

  • EInvalidOperation. Указывает на некорректную
    операцию над компонентом, в частности на
    операцию, требующую дескриптора окна для
    компонента с неопределенным свойством
    Parent. Также может быть сгенерирован при
    некорректных операциях перетаскивания.

  • EInvalidPointer. Генерируется при
    использовании неверного указателя.
    Например, при попытке обращения к
    указателю nil или передаче выделенного
    блока памяти более одгого раза.

  • EMathError. Базовый класс для математических
    ошибок при работе с числами с плавающей
    точкой. Никогда не используется напрямую
    как обьект исключения. Используются
    производные классы исключений
    EInvalidArgument,EInvalidOp,EOverflow,EUnderflow и EZeroDivide.

  • EMCIDeviceError. Указываетна ошибку при работе
    с драйвером MCI(Media Control Interface).

  • EMenuError. Указывает на некорректную
    операцию с меню. Может быть сгенерирован,
    например ,при некорректном обращении к
    обьекту меню.

  • ENoResultSet. Генерируется обьектом TQuery, если
    в запросе отсутствует оператор SELECT.

  • EOleCtrlError. Указывает на неудачную попытку
    установления связи с элементом
    управления ActiveX.

  • EOleException. Генерируется, если вызов метода
    IDispatch привел к ошибке.

  • EOleSysError. Генерируется при неудачном
    вызове метода IDispatch.

  • EOutOfMemory. Генерируется, если невозможно
    выделить требуемую память.

  • EOutOfResources. Генерируется при неудачной
    попытке создать дескриптор Windows.

  • Eoverflow. Переполнение при работе с числами
    с плавающей точкой (значение слишком
    велико) .

  • EPackageError. Генеруруется при возникновении
    ошибок, связанных с пакетами.

  • Eprinter. Указывает на ошибку, возникшую во
    время печати.

  • Eprivilege. Генерируется при нарушении
    уровней привилегии процессора, например
    если присваимаемое значение выходит за
    рамки допустимых или имеет некорректный
    тип данных.

  • EPropReadOnly. Указывает на попытку записи в
    свойство, предназначенное только для
    чтения (при использовании технологии OLE).

  • EPropWriteOnly. Указывает на попытку чтения из
    свойства, предназначенного только для
    записи (при использовании технологии OLE).

  • ERangeError. Значение, выходящее за
    допустимые рамки, для индексирования
    массива или короткой строки, а также для
    присвоения переменным скалярного или
    перечислимого типа. Эта исключительная
    ситуация не генерируется для длинных
    строк.Чтобы исключительная ситуация была
    сгенерирована, программа должна
    компилироваться с директивой {$R+}, что
    обычно делается только во время отладки.
    По умолчанию используется директива 
    {$R-}, а это исключает проверку диапазонов и
    соответсвенно возможность возникновения
    этой исключительной ситуации.

  • EReadError. Генерируется при некорректной
    попытке считать данные потока, а также
    если невозможно считать данные свойства
    при создании обьекта формы.

  • ERegistryException. Указывает на ошибку при
    выполнении операций с реестром Windows,
    такую как попытка изменить область
    реестра с несоответствующими
    привилегиями пользователя.

  • EResNotFound. Генерируется, если определенный
    ресурс, например пиктограмма, не найден.
    Распространенная причина этой
    исключительной ситуации — удаленная или
    закомментированная директива {$R*.DFM} в
    разделе implementation модуля формы.

  • ESocketError. Указывает на ошибку при работе с
    обьектом сокета Windows.

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

  • EStreamError. Базовый класс для ошибок
    файловых потоков. Обьект этого класса
    создается, если не удается выделить поток.

  • EStringListError. Указывает на ошибку в
    операциях со строковым списком, например
    при обращении к списку по неверному
    индексу.

  • Ethread. Указывает на проблему, связанную с
    синхронизацией потоков.

  • ETreeViewError. Генерируется при использовании
    неверного индекса для компонента TreeView.

  • Eunderflow. Потеря значимости при операциях с
    числами с плавающей точкой (значение
    слишком мало).

  • EVariantError. Указывает на ошибку, связанную с
    неверным использованием вариантного
    типа данных, например на такую, как
    неверное приведение типа, или индекс,
    выходящий за пределы индексного
    пространства.

  • EWin32Error. Генерируется при возникновении
    ошибки Windows. Обработчиком по умолчанию
    выводится диалоговое окно с кодом ошибки
    и строкой сообщения. Чтобы получить
    сообщение операционной системы, можно
    использовать функцию Win32Check из модуля
    SysUtils.

  • EWriteError. Генерируется при ошибках записи
    в файловый поток.

  • EZeroDivide. Деление на нуль при операциях с
    числами с плавающей точкой.

Понравилась статья? Поделить с друзьями:
  • Свойство виртуального коммутатора ошибка применения изменений
  • Связанные вместе исправленная ошибка ледяная горка
  • Свою ошибку признаю впредь обязуюсь
  • Свойственный для научного стиля ошибка
  • Связаны вместе исправленная ошибка ледяная горка ветреная погода