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
2,2863 gold badges34 silver badges46 bronze badges
asked Jul 13, 2009 at 10:08
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
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
2,2863 gold badges34 silver badges46 bronze badges
answered Jul 14, 2009 at 15:27
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
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
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
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 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 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 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
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;
-
Этот пример демонстрирует
возникновение исключительной ситуации
при делении на ноль.
|
|
! |
Внимание! При |
-
После возникновения исключительной
ситуации в блоке 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; -
{Выделение ресурса}
-
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. Деление на нуль при операциях с
числами с плавающей точкой.
Пример использования блока защищенных
ресурсов:
|
В данном случае память |
В блоке finally не обрабатываются
исключительные ситуации — они могут быть
обработаны только в блоке except.
Операторы блока finally гарантированно
выполняются независимо от того, что
произошло в предыдущем блоке try.
Вложенные блоки try-except и try-finally
Схема создания смешанных блоков
защищенных операторов и защищенных
ресурсов:
Обработка определенных
исключений
Пример:
Классы исключений: