Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1093971859
Колян
2004-08-31 21:04
2004.09.19
А в Москве снова гремят взрывы...


14-1093785588
Seldon
2004-08-29 17:19
2004.09.19
help к MemProof


3-1093269521
realbeer
2004-08-23 17:58
2004.09.19
уникальность строки dbf


4-1091483639
CAMCOH
2004-08-03 01:53
2004.09.19
Timer в Service Application


1-1094505023
массив
2004-09-07 01:10
2004.09.19
Как получить список всех форм проекта ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский