Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизНесколько вложенных try. Корректность использования. Найти похожие ветки
← →
Cosinus © (2004-08-31 11:43) [0]Что то я запутался совсем у себя с этими try, finally и except. Посмотрел несколько примеров и у меня получился какойто TRY-новый монстр:) На мой взгляд блок явно перегружен ими, но что именно выкинуть и почему, никак не въеду. Вот код...
try
try
GetMem(buffer,$1000);
Mem.Seek($10000,soFromBeginning);
try
Mem.ReadBuffer(buffer^,$1000);
Tra-lia-lia....
except
on E:exception do
MessageDlg(E.Message,mtError,[mbOk],0);
end;
finally
mem.Free;
FreeMem(buffer);
end;
except
on E:Exception do
MessageDlg(E.Message,mtError,[mbOk],0);
end;
← →
Reindeer Moss Eater © (2004-08-31 11:44) [1]Почему перегружен и даже явно?
← →
Квэнди © (2004-08-31 11:44) [2]да нет, все нормально, вполне нормальный даалеко не перегруженный блок....
← →
Cosinus © (2004-08-31 11:45) [3]>>Reindeer Moss Eater © (31.08.04 11:44) [1]
Кажется :))) Я и хочу узнать, нормально ли написал.
← →
Reindeer Moss Eater © (2004-08-31 11:47) [4]Я и хочу узнать, нормально ли написал.
Нет. Не нормально.
У тебя ident блоков на два символа, а не на один.
← →
Cosinus © (2004-08-31 11:49) [5]>>Reindeer Moss Eater © (31.08.04 11:47) [4]
Можно чуть-чуть поподробнее..
← →
Reindeer Moss Eater © (2004-08-31 11:52) [6]Более подробно уже нельзя.
← →
VMcL © (2004-08-31 11:57) [7]
try
GetMem(buffer,$1000);
try
Mem.Seek($10000,soFromBeginning);
//try
Mem.ReadBuffer(buffer^,$1000);
Tra-lia-lia....
//except
// on E: Exception do
// MessageDlg(E.Message,mtError,[mbOk],0);
//end;
finally
Mem.Free; // <- ?
FreeMem(buffer);
end;
except
on E: Exception do
MessageDlg(E.Message,mtError,[mbOk],0);
end;
← →
Cosinus © (2004-08-31 12:01) [8]>>Reindeer Moss Eater © (31.08.04 11:47) [4]
У тебя ident блоков на два символа, а не на один
Хорошо, спрошу немного более по другому. Что смотреть по этому поводу и где?
← →
Reindeer Moss Eater © (2004-08-31 12:05) [9]>Я и хочу узнать, нормально ли написал.
Нет. Не нормально.
У тебя ident блоков на два символа, а не на один.
ident блоков - это свойство редактора IDE смещать вправо/влево блоки текста прогаммы.
У тебя смещено на два символа, и это ненормально.
Нормально на один.
Я так считаю.
Ты же хотел узнать нормально или нет ты написал.
Узнал?
← →
Cosinus © (2004-08-31 12:06) [10]>>VMcL © (31.08.04 11:57) [7]
Mem.Free; // <- ?
Если я правильно понял этот вопрос, то чуть выше, я просто его не включил в этот блокmem.LoadFromFile("FileName")
← →
Cosinus © (2004-08-31 12:08) [11]>>Reindeer Moss Eater © (31.08.04 12:05) [9]
Тьфу на тебя... :))) Я то думал... Да не, мне нагляднее по два символа, я да-а-авным давно так табуляцию настроил. А один у меня сливается в какую то кашу.
← →
VMcL © (2004-08-31 12:25) [12]>>Cosinus © (31.08.04 12:06) [10]
Не, неправильно :-)
Имелось в виду, что есть Free, но не видно, где создаётся.
← →
sniknik © (2004-08-31 12:57) [13]и еще,
внешний try ... except
on E: Exception do ...
лишний, никогда не сработает, внутренний try ... finally перебьет, даже если будет ошибка.
← →
Плохиш © (2004-08-31 13:04) [14]
> sniknik © (31.08.04 12:57) [13]
> внутренний try ... finally перебьет, даже если будет ошибка
finally не обрабатывает ошибок, а передаёт их дальше
← →
KSergey © (2004-08-31 13:10) [15]> [13] sniknik © (31.08.04 12:57)
> и еще,
> внешний try ... except
> on E: Exception do ...
> лишний, никогда не сработает, внутренний try ... finally
> перебьет, даже если будет ошибка.
Ну не совсем так...
Может внутри finally будет исключение, почему бы и нет?
Вот только мне не понятно зачем исключения давить?? Да еще двумя блоками? Ну и оставить лишь внешний, если уж так хочется...
Хотя, конечно, от задачи зависит...
Пожалуй, во внутреннем смысла большого нет. Может и sniknik о том же?
← →
Cosinus © (2004-08-31 13:49) [16]>>VMcL © (31.08.04 12:25) [12]
Ну да... Чего то я не то написал... думал оmem:=TMemoryStream.Create;
Попутал :))
>>sniknik
>>Плохиш
>>KSergey
После исправлений VMcl получается двойной try finally и try except блок. Объясню зачем мне это надо. Насколько я понимаю, если в блоке try finally(если он единственный) возникает исключение, то обработать мы его никак не моГем, что не очень хорошо. Например для пользовательно совсем не прозрачна ошибка вида "Read stream error!"(ну не лучший пример конечно), генерируемая системой, и дабы было понятнее пишется что либо более разжеванное.
Я вообще иногда жалею, что конструкция Try не такая же как if, т.е...
1) if then - позволяет
2) if then else - позволяет
1) try except - позволяет
2) try except finally - не позволяет, а жаль...
← →
clickmaker © (2004-08-31 14:28) [17]
> 2) try except finally - не позволяет, а жаль...
try
Что-то.Create;
try
finally
Что-то.Free;
end;
except
end;
Это то же самое
← →
Cosinus © (2004-08-31 14:32) [18]clickmaker © (31.08.04 14:28) [17]
Да я и не спорю, это понятно. Лично для меня непонятно почему это не реализовано в одном try. ИМНО так было бы удобнее. Но это ИМНО...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c