Имя: Пароль:
IT
 
try finally
0 Ненавижу 1С
 
гуру
06.11.09
15:01
почему такой конструкции нет в 1С?
1 ДенисЧ
 
06.11.09
15:02
Назачем?
А ещё там нет using{}, нет лямбда-функций и прочих объектных вещей...
2 Ненавижу 1С
 
гуру
06.11.09
15:05
(1) а try except есть
3 Лефмихалыч
 
06.11.09
15:05
потому что не нужна
4 Rie
 
06.11.09
15:06
(0) А чем бы она отличалась от
Попытка
   // Чего-то делается
Исключение
   // Опаньки!
КонецПопытки;
// Часть finally
5 Андрюха
 
06.11.09
15:07
(0) Думаю потому что в ней все объекты должны гарантированно разрушаться по завершению работы процедуры/функции
6 Ненавижу 1С
 
гуру
06.11.09
15:07
(4) Исключение глушит ошибку, а finally нет
7 Лефмихалыч
 
06.11.09
15:09
(6) тогда

Попытка
   // Чего-то делается
Исключение
КонецПопытки;
// Часть finally
8 Лефмихалыч
 
06.11.09
15:10
точнее

Попытка
   // Чего-то делается
Исключение
   // Часть finally
   Сообщить(ОписаниеОшибки());
   Возврат;
КонецПопытки;

9 Ненавижу 1С
 
гуру
06.11.09
15:11
(8) отработает только в случае ошибки
10 Rie
 
06.11.09
15:11
(6) Ошибку можно повторить через Вызвать Исключение
11 Ненавижу 1С
 
гуру
06.11.09
15:11
(7) как и говорил, глушит ошибку
12 Ненавижу 1С
 
гуру
06.11.09
15:14
(10) тогда то самое псведо-finally (что за блок вынесено) не сработает
13 Rie
 
06.11.09
15:16
(12) Ну что ж поделаешь... :-)

Насколько я понимаю, основная задача finally в других языках - явно освободить ресурсы (вызвать деструкторы) в случае ошибки. В 1С, где сборщик мусора этим занимается, такая задача не стоит.
14 Ненавижу 1С
 
гуру
06.11.09
15:17
(13) это могут быть внешние ресурсы, например захваченные внешними компонентами
15 Rie
 
06.11.09
15:52
(14) Внешние компоненты пишутся не на 1С-ике. И сами должны освобождать ресурсы, 1С тут не в силах ни на что повлиять.
16 Андрюха
 
06.11.09
15:56
(13) Не совсем верно - finally обеспечивает гарантированное выполнение кода после блока try, т.е. например корректное высвобождение памяти, занимаемое объектом.
17 Андрюха
 
06.11.09
15:56
finally не давит исключения
18 Ненавижу 1С
 
гуру
06.11.09
15:58
(17) это ты кому написал?
19 PaulBC
 
06.11.09
16:02
(16) если б 1с умела корректно высвобождать память, оно бы может и имело смысл
20 Ненавижу 1С
 
гуру
06.11.09
16:03
(19) а она делает это некорректно?
21 PaulBC
 
06.11.09
16:06
(20) а она это делает?
22 ДенисЧ
 
06.11.09
16:08
(21) Делает
23 PaulBC
 
06.11.09
16:11
(22) например, есть большая ТЗ, которая отжирает гиг памяти. Можно ли освободить эту память без закрытия 1с предприятия?
24 Ненавижу 1С
 
гуру
06.11.09
16:12
(23)

ТЗ=Неопределено; //нет?
25 PaulBC
 
06.11.09
16:13
(24) я про 77
26 Ненавижу 1С
 
гуру
06.11.09
16:15
(25) уже давно не с 7.7, но наверное также?

ТЗ=0;
27 ДенисЧ
 
06.11.09
16:16
(23) тз.Очистить(); тз=0;
28 PaulBC
 
06.11.09
16:18
(26, 27) если бы.. это уже старая тема, просто привел для примера
29 mishaPH
 
06.11.09
16:19
(25) вариантов несколько

1. ТЗ=СоздатьОбъект("ТаблицаЗначений");

2. ТЗ="";
30 Ненавижу 1С
 
гуру
06.11.09
16:20
(28) переходи на 8.1
31 Rie
 
06.11.09
16:22
(24) Не обязательно освободит память. По крайней мере, не сразу же.
32 PaulBC
 
06.11.09
16:22
(30) )) да мне оно не мешает, а чего в сабже v7?
33 ДенисЧ
 
06.11.09
16:23
(28) Если бы ты привёл в пример Таблицу, а не ТЗ, то я согласился бы. Но с локальными переменным фокус проходит. Я в своё время с этим полюбился плотненько и долго.
34 Ненавижу 1С
 
гуру
06.11.09
16:25
(32) че то не вкурил как ее переименовать, ни разу не пробовал еще
35 Ненавижу 1С
 
гуру
06.11.09
16:26
вроде вышло
36 PaulBC
 
06.11.09
16:28
(33) про Очистить() не помню уже, пробовал или нет, давно было, а ="" и =0 точно не помогают
37 ДенисЧ
 
06.11.09
16:28
(36) Помогают. Даже с ОЛЕ, xml и метаданными.
38 Ненавижу 1С
 
гуру
06.11.09
16:28
(36) ТЗ случаем не на форме размещена?
39 PaulBC
 
06.11.09
16:35
(38) хм.. тз была на форме обработки, которая открывалась модально из моей, + там еще было пару временных тз.. но прям сейчас лезть проверять все это хозяйство просто влом
40 Ненавижу 1С
 
гуру
06.11.09
17:09
(39) и зачем на форме ТЗ хранящая гиг памяти? просто мне кажется ТЗ привязанная к элементам формы тупит
41 Torquader
 
07.11.09
21:04
Например, javascript вообще не любит освобождать объекты, даже если ему говорят об этом явно.
В 1С вроде всё не так "глухо". При очистке переменной память освобождается. Но с таблицей значений проще сначала выполнить УдалитьСтроки, чтобы гарантировано.
42 Torquader
 
07.11.09
21:09
Прелесть try{}finally{} вот в чём:
try
 {
 f=CreateFile();
 f.WriteData();
 }
catch(e)
 {
 ShowMessage("А с файлом-то фигня вышла");
 return false;
 }
finally
 {
 f.CloseHandle();
 }
Так вот, при возникновении ошибки будет обработано исключение, потом система заметит, что сделан выход из функции, и перейдёт на выполнение кода в finally, а после этого вернёт управление в вызвавшую её функцию.
В 1С try except endtry позволяют только отлавливать и обрабатывать ошибки, при этом действие try более похоже на On Error Goto от Visual Basic, чем на честную работу с исключениями (метод raise не позволяет генерить произвольных исключений, да и может использоваться только после except, что полностью отрицает его привлекательность.
P.S. зато в 1С нормальные массивы, а не как в JavaScript массивы-тормоза.
43 Кириллка
 
07.11.09
21:33
(42)а этот пример кода для какого языка? JavaScript?
44 Кириллка
 
07.11.09
21:42
+43 ладно, без прелюдий... в каком языке можно писать конструкции try-catch-finally? JavaScript?
45 Torquader
 
07.11.09
22:02
Вообще-то, try catch finally был придуман для Java, но прекрасно поддерживается и JavaScript - там ещё очень удобно делать throw "Это исключение" и в catch(Err) получать в значении Err указанную в throw строку.
На счёт C++, не уверен, насколько оно "грамотно" работает, но оно там тоже есть.
P.S. 1С, всё-таки, программа для автоматизации учёта - и там таких обработчиков исключений не сделали (а было бы интересно).
46 Ненавижу 1С
 
гуру
08.11.09
10:35
например в C#
47 Rie
 
08.11.09
11:10
Можно ещё и в Delphi (но там более сложно - у try может быть либо except-часть, либо finally, желаемое достигается вложенным try).
48 Кириллка
 
08.11.09
12:06
(46)прикольно, полезное расширение возможностей языка.