Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > обработка ошибок


Автор: chiffa 17.7.2007, 17:36
Такой вопрос. как на Делфи сделать "отталкивание от ошибок". К примену на PHP
Код

if (!@$a)
{
break;
}


тоесть если переменная/выражение не существует, а точнее возвращает ошибку нужно остановить цикл. как это можно реализовать на Делфи?

Автор: Alexeis 17.7.2007, 17:44
Если память под переменную не выделена то так
Код

if a = nil then break;

А так переменные не умеют возвращать ошибки.

Автор: MetalFan 17.7.2007, 18:04
Цитата(Alexeis @  17.7.2007,  17:44 Найти цитируемый пост)
Если память под переменную не выделена то так

точнее если указатель = nil...
а выделена или нет память по некоему указателю - так не проверишь ;)
теоретически валидность указателя можно проверить с помощью набора функций:
IsBadCodePtr;
IsBadHugeReadPtr;
IsBadHugeWritePtr;
IsBadReadPtr;
IsBadStringPtr;
IsBadStringPtrA;
IsBadStringPtrW;

Автор: chiffa 18.7.2007, 15:24
Пытаюсь так:

Код

for i := 1 to 101 do
begin
if Excel.WorkSheets[i].Activate = nil then break;
end;


Выдает: [Pascal Error] Unit2.pas(78): E2008 Incompatible types



Автор: Lunatikus 18.7.2007, 16:10
Разве свойство Activate не может иметь только true или false?Тогда конечно будет ругаться что ты его сравниваешь с непонятным ему nil.

Автор: lukas 18.7.2007, 16:18
это дельфи а не php, нужно заботится о типах... (ошибка: несовместимость типов)

Код

for i := 1 to 101 do
begin
if Excel.WorkSheets[i].Activate = False then break;
end;


А nil - это формальный ноль указателя... 

Автор: chiffa 18.7.2007, 16:33
спасибо! но код 

Код

for i := 1 to 3 do
begin

if Excel.WorkSheets[i].Activate = False then break;

//MessageDlg('Ошибка открытия ', mtWarning,  [mbYes, mbNo], 0);

Showmessage (inttostr(i));

end;


все три раза выбрасывает табличку с номером, хотя страницы существуют

Автор: MetalFan 18.7.2007, 23:38
Цитата(chiffa @  18.7.2007,  16:33 Найти цитируемый пост)
все три раза выбрасывает табличку с номером, хотя страницы существуют 


Цитата(chiffa @  18.7.2007,  16:33 Найти цитируемый пост)
if Excel.WorkSheets[i].Activate = False then break;


Activate = false в случае, если невозможна активация запрашиваемой страницы книги...
и вообще, красивее писать так:
Код

if not Excel.WorkSheets[i].Activate then break

Автор: chiffa 20.7.2007, 09:50
пасиба. Столкнулся еще с одним траблом.... 

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

mater:=Excel.WorkSheets[z].Range['C9'];

if mater = nil then
begin
Showmessage ('Лист № ' + inttostr(z) + 'вернул ошибку и не был обработан');

end;


Добавлено через 3 минуты и 26 секунд
Код

for i := 1 to 5 do
begin

if not Excel.WorkSheets[i].Activate then

begin
Showmessage (inttostr(i));
break;
end;

end;


выводит ошибку: Неверный индекс и все....

Автор: Alexeis 20.7.2007, 10:53
Цитата(chiffa @  20.7.2007,  09:50 Найти цитируемый пост)
Делфи выбрасывает ошибку и останавливает выполнение. 

  Нужно пользоваться конструкцией 
Код

try

except / finally

end


т.е. создать защищенный блок, который позволяет обрабатывать исключения.

Автор: sentry 20.7.2007, 13:28
Цитата(chiffa @  20.7.2007,  09:50 Найти цитируемый пост)
Делфи выбрасывает ошибку и останавливает выполнение


Если в Tools->Debugger Options изменить соответствующие опции (например, Stop On Delphi Exceptions), то программа не будет останавливаться.
Но если потребуется узнать тип произошедшего исключения, то нужно будет все вернуть обратно.

Автор: chiffa 23.7.2007, 09:17
Сделал так: 

Код

try
mater:=Excel.WorkSheets[z].Range['C9'];
except
Showmessage ('Лист № ' + IntToStr(z) + ' небыл обработан!');
end;


теперь программа продолжает работу, но системную ошибку о несовместимости типов продолжает выдавать....

Автор: Alexeis 23.7.2007, 09:35
chiffa, может z - это не целое число?

Автор: MetalFan 24.7.2007, 08:18
Цитата(chiffa @  23.7.2007,  09:17 Найти цитируемый пост)
но системную ошибку о несовместимости типов продолжает выдавать.... 


Цитата(sentry @  20.7.2007,  13:28 Найти цитируемый пост)
Если в Tools->Debugger Options изменить соответствующие опции (например, Stop On Delphi Exceptions), то программа не будет останавливаться.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)