Форум: "Основная";
Текущий архив: 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