Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.19;
Скачать: CL | DM;

Вниз

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

 
Nikos   (2003-05-04 18:00) [0]

Программа считывает данные с ini файла.
FIni:= TIniFile.Create(GenPath + "Options.ini");
try
k := StrToInt(FIni.ReadString("General","BDCount","Параметр не найден"));
except
on EAbort do begin
ShowMessage("Ошибка доступа к файлу Options.ini. Проверте правильность структуры этого файла. Программа будет закрыта");
Application.Terminate;
end end;

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


 
circul ©   (2003-05-04 18:05) [1]

on EAbort do begin - совершенно излишняя конструкция.
Если Exception возникнет, то управление перейдет в секцию except и так.


 
titnn ©   (2003-05-04 18:09) [2]

k := (FIni.ReadInteger("Секция","ИмяПараметра","Параметр по уомлчанию "));
Никакой ошибки и не будет , просто если параметр не найден в файле , или даже сам файл , то
k:= "значение по умолчанию"
если так нужно то ставь значение по умолчанию заведомо не используемое

k := (FIni.ReadInteger("Секция","ИмяПараметра",-1));
if k:=-1 then begin
{твой код};
end;

какие проблемы -то ?


 
Anatoly Podgoretsky ©   (2003-05-04 18:37) [3]

Убери on EAbort do begin
Сообщение лучше сделать более понятным, ошибка может возникать не только при отсутствии параметра, но например при его недопустимом значении, лучше послать в файл с инструкцией, где должен быть описан этот формат и другая информация.


 
Ну   (2003-05-05 01:15) [4]

2 Anatoly Podgoretsky © (04.05.03 18:37)
Слишком развернутый ответ. Достаточно было остановиться на "недопустимом значении", поскольку далее следует необъяснимое: "лучше послать в файл с инструкцией, где должен быть описан этот формат и другая информация."
Если лучше "послать" так ... :)))


 
circul ©   (2003-05-05 01:22) [5]

>Ну (05.05.03 01:15)

А у тебя по делу есть что сказать?


 
Ihor Osov'yak ©   (2003-05-05 01:24) [6]

2 Ну (05.05.03 01:15)

Ну, блин, арбитр нашелся. А самому ответы давать влом?


 
NA ©   (2003-05-05 01:29) [7]

Вот именно. Исключение возникнет, если действительно ситуация будет ИСКЛЮЧИТЕЛЬНОЙ :)))

Читайте хелп чаще. Возврат значения по умолчанию НЕ МОЖЕТ приводить к исключению - это нормальное поведение функции.

Впрочем, если Вам хочется имено такого исхода, то:


const ErrParam = "нунадожбылотакненапиться";

.........

try
k := StrToInt(FIni.ReadString("General","BDCount", ErrParam));
if k := ErrParam then StrToInt (ErrParam)
except
ShowMessage("Если охотиться будет не на кого, мы такого зверя выдумаем себе сами"); Application.Terminate
end;

Ну, или более цивилизованные варианты есть. Но этот мне смешнее.


 
NA ©   (2003-05-05 01:40) [8]

Протормозил спросонья конкретно - у тебя оно и есть так, как мне смешно. Тогда все должно работать ок, но про EAbort предыдущие ораторы высказывались верно.


 
Ihor Osov'yak ©   (2003-05-05 01:50) [9]

2 NA © (05.05.03 01:29)

Причина возникновения исключения в вашем примере, и примере Nikos (04.05.03 18:00) одна и та же. Это по поводу первой строчки после try. По поводу второй в вашем посте - как минимум две ошибки.. Синтакстических...

А почему Nikos исключения не ловил - как это устранить, ему не единыжды указали. А причину можно было бы догадаться самому - ловля исключения определенного типа, а не того типа, что происходит на самом деле...


 
Нуу   (2003-05-05 01:55) [10]

2 Ihor Osov"yak © (05.05.03 01:24)
Пше прашем Игорь! Какие ответы? И на что? По сабжу тут уже все есть.
см. titnn © (04.05.03 18:09)
Могу лишь добавить, что и при отсутстви секции, то же не будет исключения.

Я лишь удивился "непривычно" развернутому ответу АП, в котором его стиль слишком явно мешает "пониманию".


 
NA ©   (2003-05-05 01:58) [11]

Ihor Osov"yak © (05.05.03 01:50)
...пять утра у человека, имейте снисхождение :) - что же до опечаток, то я и сам их вижу, что ж теперь.


 
Ihor Osov'yak ©   (2003-05-05 02:05) [12]

Да ладно, Arkady.

Рискну предположить, что ты и Ну,Нуу один и тот же человек, несмотря на разные айпи. Ответов уже почти нет, просто переливание с пустого в порожнее..

> Могу лишь добавить, что и при отсутстви секции, то же не будет исключения.

Если это по отношению к titnn © (04.05.03 18:09), то об этом там также говорилось.. Так что уточнение лишнее.

Ну ладно, сорри, меня на флейм потянуло.. Спать пора..




 
Ihor Osov'yak ©   (2003-05-05 02:08) [13]

Хотя в части еквивалентности NA и Ну,Нуу я пожалуй не прав, сорри...


 
NA ©   (2003-05-05 02:21) [14]


> Рискну предположить, что ты и Ну,Нуу один и тот же человек


Предположение неверное. Я не Нуу, нуу никак :) независимо от IP.
Что касается ответа на вопрос, его действительно дали уже минимум пять человек :)

Теперь по невнятности моего ответа, хотелось бы. Тормоз начался с того, что я ошибочно принял k за _строковую_ переменную, отсюда все и поперло (включая призывы читать хелп етц). StrToInt у автора темы заметил уже после своего ответа - из строки в топе форума. :(

Опечатки: для моего примера в первой строке не должно было быть StrToInt (строка тупо воткнута через буфер), и во второй вместо знака присваивания, ессно, сравнение. Всё.
Функции без присвоения результата компиятор позволяет. Иду спать также. 05:22 уже по нашему, азиатскому... :)


 
Ihor Osov'yak ©   (2003-05-05 04:47) [15]

2 NA © (05.05.03 02:21)

Флейма ради + безсоница у меня... + добродушно я все это, без злобы...

> Опечатки: для моего примера в первой строке не должно было быть StrToInt (строка тупо воткнута через буфер), и во

Убираем StrToInt - получаем несоответствие типов..

> во второй вместо знака присваивания, ессно, сравнение. Всё.

Снова несоответствие типов остается. Ибо k как бы не строковая...

То есть устраняем одну ошибку, делаем вторую..

Ладно, пойду спать...



 
Nikos   (2003-05-05 14:58) [16]

А если вот такой код
try
k := StrToInt(FIni.ReadString("General","BDCount","Параметр не найден"));
n := StrToInt(FIni.ReadString("General","BDIndex","Параметр не найден"));
except
ShowMessage("Ошибка доступа к файлу Options.ini. Проверте правильность структуры этого файла. Программа будет закрыта");
end;

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


 
circul ©   (2003-05-05 15:03) [17]

>Nikos (05.05.03 14:58)
А можно узнать, как ты будешь при использовании Exception определять, в какой строке возникла ошибка?


 
evvcom ©   (2003-05-05 15:09) [18]

C вероятностью 100% никак. Уже было предложено присваивать по умолчанию неиспользуемое значение, например, так:
k := StrToInt(FIni.ReadString("General","BDCount","-1"));
Ну а потом сравнивай, <0 там или что другое.


 
Владислав ©   (2003-05-05 15:22) [19]

А не проще использовать ReadInteger, ValueExists?


 
evvcom ©   (2003-05-05 15:29) [20]


> Владислав © (05.05.03 15:22)
> А не проще использовать ReadInteger, ValueExists?

Можно и так, но тогда опять - обработка исключений. Ведь в файле можно прописать и какую-нибудь бяку типа строковой информации.


 
Nikos   (2003-05-05 15:39) [21]

Все это понятно. Дело в другом. Вот код
try
k := StrToInt(FIni.ReadString("General","BDCount","-1"));
n := StrToInt(FIni.ReadString("General","BDIndex","-1"));
except
showmessage("Если ошибка произошла при считывании параметра BDCount, то одно сообщение, если при BDIndex, то другое");
end;

Пример мог быть и другим. Главное в моем вопросе не конкретный пример, а какой оператор в списке между try и except вызвал исключение?


 
WarLord ©   (2003-05-05 15:47) [22]


> Nikos

блин, ну сделай
try
k := StrToInt(FIni.ReadString("General","BDCount","-1"));
except
showmessage("Если ошибка произошла при считывании параметра BDCount, то одно сообщение");
end;

try
n := StrToInt(FIni.ReadString("General","BDIndex","-1"));
except
showmessage(" то другое");
end;


 
Smithson ©   (2003-05-05 15:48) [23]

if k = -1 then Первая строка
else Вторая строка.

Кавычки от -1 убери :-))


 
WarLord ©   (2003-05-05 15:50) [24]


> Smithson © (05.05.03 15:48)
>
> Кавычки от -1 убери :-))

это ж умолчательное строковое значение


 
Smithson ©   (2003-05-05 15:52) [25]

Тормоз я. Спать хочу - не буду больше формулу ночами лупать, записывать буду...


 
Владислав ©   (2003-05-05 15:52) [26]

> evvcom © (05.05.03 15:29)

"Можно и так, но тогда опять - обработка исключений. Ведь в файле можно прописать и какую-нибудь бяку типа строковой информации."

С чего ты так решил? Тогда будет default значение.

> Nikos (05.05.03 15:39)

Если уж на то пошло, то первоначально вопроса вообще не было. ;)

Ты бы уточнил, что тебе надо... Если ты работаешь с ini файлом, на кой тебе вообще ловить какие то exceptions, которые ты при этом создаешь собственными руками?!


 
REA ©   (2003-05-05 15:53) [27]

Что за INI файл такой без которого ничего не работает? Сбросить все значения по умолчанию и предупредить пользователя об этом.


 
NA ©   (2003-05-05 21:53) [28]


> Флейма ради + безсоница у меня... + добродушно я все это,
> без злобы...
...
> Снова несоответствие типов остается. Ибо k как бы не строковая...


читаем выше:
> ошибочно принял k за _строковую_

Вывод: здоровый сон еще никому не мешал.


 
NA ©   (2003-05-05 22:01) [29]


> Nikos (05.05.03 15:39)
> Все это понятно. Дело в другом. Вот код

ну, это уж вообще проще простого:


try
b:= 1; k := StrToInt(FIni.ReadString("General","BDCount","qwe"));
b:= 2; n := StrToInt(FIni.ReadString("General","BDIndex","qwe"));
except
ShowMessage("Ошибка на шаге " + IntToStr (b))
end;


Если есть желание перегружать код, можно и так:
except
case b of
1 : S := ErrorString + "DBCount";
2 : S := ErrorString + "DBIndex" else S := ErrorString + "хз что за параметр" end;
ShowMessage (S)
end


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


 
circul ©   (2003-05-05 22:04) [30]

Так что же тебе надо в итоге, все-таки? То ли получить строку, в которой произошла ошибка, то ли избавиться от стандарной обработки Exception?



Страницы: 1 вся ветка

Текущий архив: 2003.05.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.013 c
1-59771
alexus
2003-05-05 15:19
2003.05.19
запуск exe-файла из приложения


11-59641
Сандро
2002-08-12 12:48
2003.05.19
Формы


8-59807
Rom@n
2003-02-08 08:26
2003.05.19
Мультимедиа


6-59819
ILYA!
2003-03-19 16:29
2003.05.19
Помогите чайнику нужен доступ к БД через Интернет


1-59745
Fighter
2003-05-06 10:21
2003.05.19
Как обращаться к объекту по