Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.006 c
1-59677
NiBL'S
2003-05-07 15:06
2003.05.19
MDI ???


8-59805
Vbmen
2003-02-08 09:39
2003.05.19
Работа со звуком


1-59796
VVR
2003-05-06 14:46
2003.05.19
Проблемы с подключением к Word


1-59762
cult
2003-05-06 15:20
2003.05.19
HTML to text


1-59759
KSergey
2003-05-05 13:30
2003.05.19
Можно ли множество (Set Of) перевести в Integer?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский