|
v8: Методический вопрос по передаче параметров в функцию и их возврат. | ☑ | ||||||
---|---|---|---|---|---|---|---|---|
0
Doomer
06.09.11
✎
09:11
|
Часто встречаю в типовых такой код:
Перем а; ЗаполнитьЗначение(а); Б=а[0]; Я же привык к такому коду: а=ЗаполнитьЗначение(); Б=а[0]; Т.е. в типовых часто в процедуру передают переменную с которой идет работа внутри этой процедуры. По окончании работы процедуры используется изменная переменная. Я же привык (по моему так и учили) что нужно стремиться чтобы функции и процедуры были автономны и для возврата параметра лучше использовать функции. Так как правильно? |
|||||||
1
Fragster
гуру
06.09.11
✎
09:13
|
голосовалка где?
|
|||||||
2
ДенисЧ
06.09.11
✎
09:13
|
апофиг
|
|||||||
3
GROOVY
06.09.11
✎
09:14
|
(0) Представь что надо несколько параметров обсчитать и изменить в процедуре/функци, все станет понятно.
|
|||||||
4
Stepa86
06.09.11
✎
09:15
|
Как бэ читабельность и понятность первого примера в разы выше, чем второго, хотя правильнее не менять переменную, а возвращать... но обычно это муторнее и неоправдано
|
|||||||
5
Defender aka LINN
06.09.11
✎
09:16
|
(0) А если "а" ВНЕЗАПНО окажется не коллекцией, или коллекцией, но пустой?
|
|||||||
6
Doomer
06.09.11
✎
09:16
|
(3) А почему нельзя вернуть структуру?
|
|||||||
7
Fragster
гуру
06.09.11
✎
09:16
|
(6) соответствие круче
|
|||||||
8
Sammo
06.09.11
✎
09:16
|
А потом потребовалось еще в этой же функции обрабатывать еще 1 переменную. И опаньки. А так - еще один параметр
|
|||||||
9
Doomer
06.09.11
✎
09:17
|
(4) В чего это она выше? Во втором варианте понятно что с переменной что-то произошло. А в первом нет.
|
|||||||
10
ptiz
06.09.11
✎
09:17
|
Структура рулит.
Её можно и передать, и вернуть. |
|||||||
11
GROOVY
06.09.11
✎
09:19
|
(6) Ну напиши код когда 3 параметра в функции увеличиваются на +1 и возвращаются как структура, и сравни с кодом когда это происходит через параметры процедуры. Раз в 6 строк больше будет.
|
|||||||
12
Stepa86
06.09.11
✎
09:19
|
(9) функция не может называться Заполнить... тогда уж ПолучитьЗаполненноеЗначение, а так когнитивный диссонанс вызывает такая запись... и вообще в методе написано про значение, а в переменной оказалась коллекция O_o
|
|||||||
13
Doomer
06.09.11
✎
09:21
|
Я почему спросил. Часто при отладки сталкиваюсь с первым примером. Мне не понятно в таком случае изменила ли процедура переменную/ые или нет. Нужно обязательно посмотреть как работает процедура. С функцией все понятно.
|
|||||||
14
Doomer
06.09.11
✎
09:22
|
(11) Согласен, что кода будет больше. Но по моему читабильность такого кода выше.
|
|||||||
15
GROOVY
06.09.11
✎
09:23
|
(14) Ну тут спорно. Кто как привык. Да и сам понимаешь, часто а читабельность забивают.
Еще стоит помнить про дифференцированные значения аргументов, то же тема. |
|||||||
16
Jolly Roger
06.09.11
✎
09:24
|
точнее, должно быть так:
Перем а; а = новый НужныйОбъект; ЗаполнитьЗначение(а); Б=а[0]; Правильный вариант №1 |
|||||||
17
Тихий омут
06.09.11
✎
09:28
|
имхо, сложившееся за 18 лет программирования:
1. если функция проста и однозначна (типа математических синусов и проч.) - она должна возвращать результат своей работы - значение, полученное в результате вычислений 2. если функция сложнее простой арифметики - она должна возвращать код результата (ошибка или всё ок), в вот результат своей работы - структуру, значение и проч. - уже через параметры. код, написанный с таким подходом, надёжен и понятен. не знаю, как проголосовать сразу за всех (против всех [за себя])? :))) Правильный вариант №1 |
|||||||
18
SeraFim
06.09.11
✎
09:29
|
Привык делать, как в №2, но потом пару раз наткнулся, что нужно возвратить Истину или Ложь, в случае успеха/неуспеха заполнения.
Перем а;
Переучиваюсь на №1 Правильный вариант №1 |
|||||||
19
Starhan
06.09.11
✎
09:34
|
(18)Бывают еще такие варианты.
Перем а; а = ЗаполнитьЗначение(); Если а <> Неопределено Тогда Б=а[0]; КонецЕсли; |
|||||||
20
Stepa86
06.09.11
✎
09:36
|
(17) лучше для обработки ошибки юзать ВызватьИсключение и ловить их в Попытке, а то обработка статусов и самописная работа с ошибками усложняет правильную логику сильно
|
|||||||
21
SeraFim
06.09.11
✎
09:37
|
(19)о! еще одна голосовалочка!
|
|||||||
22
VVi3ard
06.09.11
✎
09:44
|
Функция должна возвращать результат своей работы на то она и Функция.
Согласен с (17) если нужно тебе передать ошибку из функции наверх генерируй исключение. Если функция должна возвратить несколько значений они должны быть упакованы в структуру или иной подходящий объект. Если вам нужно изменить переданные параметры то используйте процедуру и называйте её понятно Правильный вариант №2 |
|||||||
23
Ненавижу 1С
гуру
06.09.11
✎
09:45
|
(20) попытку лучше использовать только для неуправляемых ресурсов (файлы и проч.)
|
|||||||
24
Stepa86
06.09.11
✎
09:47
|
(23) попытка это штатный механизм обработки исключительных ситуаций, зачем придумывать что то свое?
|
|||||||
25
izekia
06.09.11
✎
09:50
|
(24) вызов исключения дорогой получается, проще при возможности определения ошибки в коде просто возвращать некий статус
|
|||||||
26
izekia
06.09.11
✎
09:51
|
второй вариант немного оптимальнее, особенно если функция вызывается часто
Правильный вариант №2 |
|||||||
27
Stepa86
06.09.11
✎
09:51
|
(25) с чего бы он дорогой? и работа со статусами не займет больше времени при разработке и при выполнении?
|
|||||||
28
Ненавижу 1С
гуру
06.09.11
✎
09:52
|
(24) потому что тем самым можно заглушить другие ошибки, кои не надо глушить
|
|||||||
29
VVi3ard
06.09.11
✎
09:52
|
Просто использовать функции только для того чтобы они возвращали коды ошибок как то некрасиво, они для других целей были придуманы. Вот представь себе конфигурацию в которой все функции возвращают коды ошибок и меняют переданные параметры.
Или вот 1С почитали нашу ветку и думают а что (16) (17) (18) правы давайте будем меять значения переданные в функцию и переделают ТекущаяДата(), Формат(), СокрЛ(). |
|||||||
30
Stepa86
06.09.11
✎
09:53
|
(28) при прямых руках ничего не глушиться и падает в то исключение, которое под эти ошибки выделено
|
|||||||
31
Ненавижу 1С
гуру
06.09.11
✎
09:54
|
(30) согласен, но всегда можно что нибудь упустить из виду, не зря их не рекомендуют юзать (в книгах совсем не про 1с)
|
|||||||
32
VVi3ard
06.09.11
✎
09:55
|
Ещё раз, хотите менять значения параметров используйте Процедуры. Хотите получать функцию от переданых значений используйте функцию. Если внутри Процедуры не получается обработать ошибку бросайте исключение вам должно быть всё равно кто и для чего вас вызвал, вы свою задачу выполнили и сообщили миру что "нешмогла" а дальше это проблемы мира обрабатывать ваше исключение или порушиться
|
|||||||
33
Stepa86
06.09.11
✎
09:55
|
+(30) и вообще как они могут быть заглушены? если есть ошибка, она падает в исключение, где нужно ее обработать
|
|||||||
34
izekia
06.09.11
✎
09:55
|
(27) может в 1С это дешевле, но обычно там много всего помещается в стек и алгоритм работы несколько другой нежели обычный возврат значения из функции
так что исключение нужно применять только в соответствующих случаях |
|||||||
35
Stepa86
06.09.11
✎
09:56
|
(31) как раз в книгах не по 1С видел рекомендации не писать свою обработку ошибок, основанную на возвращении статусов, а юзать try/catch
|
|||||||
36
izekia
06.09.11
✎
09:58
|
(33) она может попасть на тот уровень на котором именно это исключение не может быть обработано
а так как в 1С фильтрации по типу исключения нет, то соответственно придется писать достаточно запутанный код |
|||||||
37
izekia
06.09.11
✎
09:59
|
(35) конкретный пример книги приведи пожалуйста? и про какой язык?
|
|||||||
38
Stepa86
06.09.11
✎
10:01
|
(34) при использовании исключений у нас 2 ветки для работы - основная, когда все ОК, на которой мы концентрируемся, и возникшие ошибки, которые падают в исключения и которые мы обрабатываем отдельно... выглядит это так:
пример без исключений: Статус = СделатьЧтоТоАдин( Параметры,,, ТекстОшибки ); Если Не Статус = СтатусОК() Тогда СообщитьОбОшибке(ТекстОшибки); Возврат; КонецЕсли; Статус = СделатьЧтоТоДва( Параметры,,, ТекстОшибки ); Если Не Статус = СтатусОК() Тогда СообщитьОбОшибке(ТекстОшибки); Возврат; КонецЕсли; Статус = СделатьЧтоТоТри( Параметры,,, ТекстОшибки ); Если Не Статус = СтатусОК() Тогда СообщитьОбОшибке(ТекстОшибки); Возврат; КонецЕсли; Пример с исключением: Попытка СделатьЧтоТоАдин(Параметры); СделатьЧтоТоДва(Параметры); СделатьЧтоТоТри(Параметры); Исключение СообщитьОбОшибке( ИнформацияОбОшибке() ); КонецПопытки; |
|||||||
39
Ненавижу 1С
гуру
06.09.11
✎
10:01
|
||||||||
40
Ненавижу 1С
гуру
06.09.11
✎
10:04
|
(38) ерунда, например (чисто для примера конструкции):
МассивОшибок=Новый Массив; СделатьЧтоТоАдин(Параметры,МассивОшибок); СделатьЧтоТоДва(Параметры,МассивОшибок); СделатьЧтоТоТри(Параметры,МассивОшибок); ВывестиОшибки(МассивОшибок); |
|||||||
41
Stepa86
06.09.11
✎
10:04
|
(37) книгу не помню, вроде есть у Макконнелла в Совершенном коде для сей и джавы и в Чистом коде у Роберта Мартина. Не исключаю, что есть у Джоэла Спольски, у Фаулера и у Бека. Конкретно искать сильно впадлу
|
|||||||
42
Stepa86
06.09.11
✎
10:05
|
(40) а как же не делать второй метод, если ошибка в первом?
|
|||||||
43
izekia
06.09.11
✎
10:06
|
(38) а ты представь развитие второго варианта?
в 1С нет конструкции, которая описывала бы возможный вариант исключения, соответственно чтобы определить что функция может завершиться с исключительной ситуацией нужно исследовать текст этой функции, иначе ты будешь постоянно натыкаться на проблемы во время выполнения кода вызывающего данные функции + если функция часто вызывается и ошибочная ситуация возникает часто, то это очень дорого будет по времени |
|||||||
44
Ненавижу 1С
гуру
06.09.11
✎
10:07
|
(42) проверить на пустоту ошибок
|
|||||||
45
Stepa86
06.09.11
✎
10:07
|
(36) код становиться менее запутанным, потому что основная логика отдельно, а исключительные ситуации отдельно... а если исключение вылезет пользователю, то или так задуманно (как в типовых) или это такая же ошибка программиста, как и остальные. Это так же, как не писать контроль остатков, потому что есть вероятность там сделать ошибки и чо нить поломать...
|
|||||||
46
izekia
06.09.11
✎
10:08
|
(41) просто там скорее всего речь идет о ситуациях, где ты не можешь явно детектировать возникновение ошибочной ситуации ... к примеру выделение памяти или чтение файла ...
но не ошибочная ситуация, которую можно определить на определенном этапе выполнения |
|||||||
47
Ненавижу 1С
гуру
06.09.11
✎
10:09
|
был случай
Попытка //тут поставили чтоб избежать ошибки, что параметр не структура Метод(); Исключение ... КонецПопытки; в Метод() позже добавили некорректный код, а ошибку (должен был валится синтаксис!) не обнаружили, все это в проведении документа, вот так вот |
|||||||
48
Ненавижу 1С
гуру
06.09.11
✎
10:10
|
||||||||
49
Stepa86
06.09.11
✎
10:13
|
(44) и код будет выглядеть как в (38) первый вариант... или ты предлагаешь узнавать о наличии ошибок внутри процедуры, которая как бэ вообще не должна знать о существовании соседей?
(43) в СП не встречал фразы, типа если передано некорректное значение - будет сгенерировано исключение? и ничо, как то все работают и используют эти функции не влезая в дебри... и обычно если какой то метод генерит искючение, то или метод плохо написан - стандартная ситуация для любого метода и тут нужно править, или методу передали то, на что он не рассчитан, то это проблема программиста, который ее так вызывает >>+ если функция часто вызывается и ошибочная ситуация возникает часто, то это очень дорого будет по времени если исключительная ситуация часта, то ее есть смысл обрабатывать как то иначе, потому что это уже не исключительная ситуация. Да и не дорого это, работа с БД в разы дороже |
|||||||
50
Ненавижу 1С
гуру
06.09.11
✎
10:14
|
(49) она и не будет знать, она будет знать о наличии ошибок или их отсутствии только
|
|||||||
51
sttt
06.09.11
✎
10:14
|
а я специально так делаю ))
Правильный вариант №1 |
|||||||
52
Stepa86
06.09.11
✎
10:17
|
(50) а откуда она знает, что эти ошибки не дадут ей правильно отработать?
(48) тыкни в конкретные посты, чтоле, там конструктива еще меньше, чем тут (46) там про общую структуру работы с ошибками |
|||||||
53
Ненавижу 1С
гуру
06.09.11
✎
10:18
|
(52) ткнул на конкретный пост и ссылки от него идут
(52) я так понял он хотел чтоб при наличии ошибок (неважно каких) она не стала бы отрабатывать |
|||||||
54
Stepa86
06.09.11
✎
10:20
|
Роберт Мартин, Чистый Код. Глава 7. Обработка ошибок: http://screencast.com/t/ywGXkEmkzQ7
Макконнелла пересматривать не буду |
|||||||
55
Alexandr Puzakov
06.09.11
✎
10:21
|
Пофиг. Лишь бы выдерживался принцип - "безобразно, но однообразно".
|
|||||||
56
izekia
06.09.11
✎
10:24
|
как-то так ... еще один довод против использования исключений
http://imglink.ru/show-image.php?id=a8704306baca92382fa1b9a078211028 передача неправильного параметра, кстати, в 1С и должна вызывать исключение, но это уже касается разработки неких общих библиотек, что для 1С нехарактерно |
|||||||
57
VVi3ard
06.09.11
✎
10:25
|
(40) Вот круто если у тебя
СделатьЧтоТоАдин выполняется 15 минут, СделатьЧтоТоДва выполняется 10 минут, СделатьЧтоТоТри 15 минут и ошибка у тебя в первой строке "СделатьЧтоТоАдин" пользователь прождет 40 минут и увидит ошибку типа "Ошибка при чтении файла". |
|||||||
58
Stepa86
06.09.11
✎
10:26
|
(53) на 25ый пост указывает? так там не написано почему плохо использовать для обработки исключительных ситуаций,
в примере (38) во втором случае каждая функция внутри не проверяет контекст на возможность работы изза предыдущих ошибок, а просто делает только то, что должна, вызывая исключение, если не справляется. |
|||||||
59
Дикообразко
06.09.11
✎
10:27
|
тупая ветка
|
|||||||
60
Ненавижу 1С
гуру
06.09.11
✎
10:29
|
а транзакции попытка так вообще песня
|
|||||||
61
Stepa86
06.09.11
✎
10:31
|
(56) и? вызов исключения занимает 0,4/10000 секунды, хочется экономить такие значения, надо писать на чем то более низкоуровневом, а для 1Ски это мгновенно
|
|||||||
62
Stepa86
06.09.11
✎
10:32
|
(60) если произошла ошибка внутри транзакции, то ее надо б откатить, я ж не говорю, что попытку надо юзать для реализации основной логики
|
|||||||
63
sttt
06.09.11
✎
10:32
|
+(59)
|
|||||||
64
Дикообразко
06.09.11
✎
10:33
|
против исключений есть только один убедительный довод:
отлаживать заип...ся попробуйте напременять исключения и потом в этом коде найти ошибку с помощью режима отладчика "останавливаться при ошибке" |
|||||||
65
izekia
06.09.11
✎
10:34
|
(62)
> я ж не говорю, что попытку надо юзать для реализации основной логики о, уже ближе) |
|||||||
66
izekia
06.09.11
✎
10:35
|
(64) кто мешает на период отладки отключить обработку исключений
|
|||||||
67
Stepa86
06.09.11
✎
10:35
|
(64) нормально все, и с помощью остановки по ошибке очень хорошо ловятся исключительные ситуации в коде, а если ошибка в другом месте, то нормальный код очень редко генерит исключения
|
|||||||
68
VVi3ard
06.09.11
✎
10:35
|
Я сталкиваясь с кодом некоторых 1С Программистов прихожу в ярость, это не код это зачастую поток сознания в виде спагети, процедуры читают и меняют глобальные переменные используют их для передачи параметров в другие процедуры, зависят от вызывающего контекста, если потребуется хоть одну процедуру перенести из проекта в другой проект приходится половину переписывать отвязывать от реквизитов формы и обработки через которые организован обмен это пи...ц просто.
С обработкой ошибок это тоже тот ещё цирк если я хочу использовать процедуру я блин должен для неё лично написать обработку её ошибок потому как исключение она не генрит в итоге. Я думал это только мне не повезло с наследством, как вижу это общий тренд... Печально. |
|||||||
69
sttt
06.09.11
✎
10:35
|
посмотрел посты про исключения и понял, что 1сник ленивый и жадный )
|
|||||||
70
VVi3ard
06.09.11
✎
10:37
|
(64) Если у тебя при отладке сыпятся сплошные исключения да ещё и в циклах то есть повод задуматься. Исключения должны быть редки если их дохрена есть повод задуматься.
|
|||||||
71
Дикообразко
06.09.11
✎
10:39
|
(66)(67) попытка всегда генерит исключения, если что
(70) так о чем и речь... исключения это плохой стиль программирования |
|||||||
72
Stepa86
06.09.11
✎
10:42
|
(71) Попытка никогда не генерирует, генерирует ВызватьИсключение или сама платформа
|
|||||||
73
Дикообразко
06.09.11
✎
10:45
|
(72) тебе не хватает фантазии
при отсутствие всяких этических ограничений, возникают программные конструкции типа такой: Попытка ЗначениеРеквизита = Форма.ИмяРеквизита: Исключение ЗначениеРеквизита = Неопределено; КонецПопытки; такой код генерит охрененное количество исключений, отладка превращается в муку |
|||||||
74
Stepa86
06.09.11
✎
10:46
|
(73) дык это говн0код, кто ж говорит, что так можно писать?
|
|||||||
75
Дикообразко
06.09.11
✎
10:46
|
(74) а кто сказал, что нельзя? ))))
|
|||||||
76
Ненавижу 1С
гуру
06.09.11
✎
10:47
|
(74) тогда и в (38) второй вариант говн0код в общем случае
|
|||||||
77
Дикообразко
06.09.11
✎
10:49
|
(76) второй вариант, по определение говн0код,
за такую писанину надо яйца отрывать |
|||||||
78
Дикообразко
06.09.11
✎
10:50
|
+(77) тем более вариант 1 не равен варианту 2
|
|||||||
79
VVi3ard
06.09.11
✎
10:50
|
(74) Бросай это дело, бисер нынче дорог чтобы так бездумно его тратить.
|
|||||||
80
Stepa86
06.09.11
✎
10:50
|
(76) Почему? в (73) мы стучимся в неизвестный реквизит и вместо того, чтобы что то сделать, чтоб он был всегда или сообщить наверх, что данные некорректны. Исключение составляет универсальный метод, в который падает произвольная форма. в (38) нормальная обработка ошибок, а не спагетти или велосипеды как в (40)
|
|||||||
81
Дикообразко
06.09.11
✎
10:51
|
(80) потому что так пишут быдлопрограммисты
|
|||||||
82
Stepa86
06.09.11
✎
10:52
|
(81) как так? Правильно? с использованием механизмов платформы? или любой стиль программирования, отличный от твоего, это быдлокод?
|
|||||||
83
Stepa86
06.09.11
✎
10:53
|
(78) и в чем различие?
|
|||||||
84
Дикообразко
06.09.11
✎
10:53
|
+(81) одно и требовании к современному программированию это возможность повторяемости, т.е. повторному использованию кода...
твой код если скопировать, то он работать не будет ибо еще нужно переменные не забыть, а код Ненавижу 1С не зависит от контекста выполнения... не знать этого - позор для программиста, т.к. этому в школе еще учат |
|||||||
85
Stepa86
06.09.11
✎
10:54
|
(84) какие переменные то?
|
|||||||
86
Дикообразко
06.09.11
✎
10:58
|
(85) если бы функция ИнформацияОбОшибке() не была бы встроенной в платформу то тебе пришлось бы организовывать стек для хранения сообщений...
в данном же случае, текст ошибки тебе дает как минимум в два раза меньше пользы, т.к. программисту усложняется возможность поиска места ошибки + полностью прогнать код и выявить все ошибки тоже будет невозможно |
|||||||
87
Stepa86
06.09.11
✎
10:58
|
(84) в отличие от кода Ненавижу 1С даже переменные дополнительные для учета ошибок не надо создавать, а методы прекрасно вызываются и из других мест, и копипастяться проще, чем методы, которые возвращают статусы, которые еще в точке вызова нужно особенно обрабатывать.
меня почему то в школе не учили защитному программированию, но я научился сам |
|||||||
88
Ненавижу 1С
гуру
06.09.11
✎
11:00
|
(87) " и копипастяться проще" стиль программирования ясен
|
|||||||
89
Stepa86
06.09.11
✎
11:01
|
(86) если б не было метода ИнформацияОбОшибке(), то встроенный механизм обработки ошибок и не работал бы. Текст ошибки сообщает о исключительной ситуации, туда я могу засунуть столько инфы, сколько захочу, а программист сразу же найдет ошибку, выставив флаг остановки по ошибке. Иди почитай хотя бы университетский курс по программированию, а то школьного тебе явно мало
|
|||||||
90
Stepa86
06.09.11
✎
11:02
|
(88) я про перенос в другую конфу и в ответ на "твой код если скопировать, то он работать не будет", так что не передергивай
|
|||||||
91
Дикообразко
06.09.11
✎
11:02
|
(89) а теперь попробуй протрассировать свой код и найти бажное место...
|
|||||||
92
Дикообразко
06.09.11
✎
11:03
|
>>>программист сразу же найдет ошибку, выставив флаг остановки по ошибке.
не найдет... отладчик перейдет на исключение |
|||||||
93
Господин ПЖ
06.09.11
✎
11:03
|
1С внятно try catch обработать не в силах - на все про все - одна беда, п.э. избыточное использование поппыток - не камильфо...
|
|||||||
94
Stepa86
06.09.11
✎
11:04
|
(92) дык исключение там, где ошибка!
(91) легко все трассирую и отлаживаю |
|||||||
95
Дикообразко
06.09.11
✎
11:05
|
(94) исключение... в конструкции исключение..
ты там вообще чем руководишь? бумажки что ли только пишешь и совещания проводишь? |
|||||||
96
Stepa86
06.09.11
✎
11:07
|
(95) отладчик остановится на строчке ВызватьИсключение, а не в конструкции исключения. Ты вообще знаешь, как работает Попытка исключение?
|
|||||||
97
Ненавижу 1С
гуру
06.09.11
✎
11:09
|
(96) послушай, из твоих фраз следует примерно следующее:
попытка/исключение очень удачный вариант, но в большинстве случаев его не следует использовать это если все твои предложения/оговорки прочитать |
|||||||
98
Дикообразко
06.09.11
✎
11:09
|
(96) гг, оказывается доработали отладчик...
бывает... а теперь расскажи как в твоем коде сделать полный сбор ошибок |
|||||||
99
Дикообразко
06.09.11
✎
11:14
|
+(98) усложняем ситуацию...
ты переносишь готовую процедуру (не забываем про повторяемость) в свою попытку..., а там неожиданно была своя попытка исключение что в итоге получим? |
|||||||
100
Дикообразко
06.09.11
✎
11:15
|
Процедура РазДваТри()
а = 1; б = 0; Попытка с = а/б; Исключение Сообщить("Ошибка"); КонецПопытки КонецПроцедуры Процедура Привет() Сообщить("Пока"); КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка РазДваТри(); Привет() Исключение Сообщить("Ошибка"); КонецПопытки КонецПроцедуры ЗЫ. ну вообще 1С стала значительно лучше работать с попытками |
|||||||
101
VVi3ard
06.09.11
✎
11:15
|
(99) Переносишь или вызываешь из своей процедуры?
|
|||||||
102
Stepa86
06.09.11
✎
11:15
|
(97) моя позиция, если внутри метода нужно обработать исключительную ситуацию и вернуть эту инфу выше (обработка ошибки по простому если), то надо использовать ВызватьИсключение с отловом в попытке, а не возвращать статус с доп. инфой и его самостоятельно обрабатывать.
Исключительная ситуация, это когда непонятно что делать, потому что нет данных или как раз понятно, что пришли ошибочные данные. Все остальное нужно обрабатывать без исключений и при правильных данных в исключение никогда не упадет. Отдельно можно рассматривать конструкции типа //проверка имени реквизита на корректность Попытка структ.Вставить( имяРеквизита ); Исключение Сообщить("Не корретно"); КонецПопытки |
|||||||
103
Stepa86
06.09.11
✎
11:17
|
(98) а зачем? если у нас есть первая ошибка, то далеко не факт, что вторая самостоятельна, а не следствие первой
|
|||||||
104
izekia
06.09.11
✎
11:19
|
(87) не защитное программирование
а писать безопасный код |
|||||||
105
VVi3ard
06.09.11
✎
11:20
|
(103), Похоже (98) не знает о существовании ВызватьИсключение(). Не думаю что стоит ему рассказывать об этом за бесплатно :))
|
|||||||
106
Дикообразко
06.09.11
✎
11:22
|
(103) если ты используешь не свои процедуры, то какие у тебя гарантии того, что туда не вставят свои попытки? и при этом не забудут передать информацию об ошибке выше?
|
|||||||
107
Stepa86
06.09.11
✎
11:23
|
(99) там много различных ситуаций и сильно зависит от контекста, единого решения есессно нет. Я пытаюсь замкнутые методы писать в безопасной области, то есть попытками проверяются входные параметры в экспортных методах, а все то, что внутри (что вызывает метод) считаем безошибочным
|
|||||||
108
VVi3ard
06.09.11
✎
11:23
|
(106) это проблемы того кто будет вызывать твою функцию, какие у тебя гарантии что этот человек проверит состояние возвращаемое твоей функцией?
|
|||||||
109
Дикообразко
06.09.11
✎
11:24
|
(108) ситуация обратная... я использую чужую функцию и я никогда не забывают проверять состояние переменных, где гарантии, что внутри нету или не появятся свои исключения?
|
|||||||
110
Stepa86
06.09.11
✎
11:24
|
(106) а мне пофик чо там внутри, пусть она ругнется исключением, если я что то не то на вход дал и сделает как надо, если дал то
|
|||||||
111
Дикообразко
06.09.11
✎
11:24
|
(110) в твоей попытке код дальше выполняться будет
|
|||||||
112
Stepa86
06.09.11
✎
11:26
|
(111) а что в этом плохого? значит вызванная функция отработала корретно
|
|||||||
113
Stepa86
06.09.11
✎
11:27
|
(104) не придирайся, у Макконнелла это называется защитным программированием, а безопасный код в моем понимании, это тот, который не порушит данные, а не корректно обработает ошибки
|
|||||||
114
Дикообразко
06.09.11
✎
11:28
|
(112) как узнать, что на нижних уровнях произошла исключительная ситуация? это информация бывает необходима
|
|||||||
115
Ненавижу 1С
гуру
06.09.11
✎
11:30
|
изощренный пример:
Попытка ПолучитьФорму("Форма1").ОткрытьМодально(); //в орме1 юзер нжал кнопку с обработчиком Б=1/0; Исключение Сообщить(1); //исключение вызвано не было! КонецПопытки; |
|||||||
116
Дикообразко
06.09.11
✎
11:31
|
(115) но надо признать, обработка исключительных ситуации у 1С стала значительно лучше...
еще бы стэк и было бы счастье |
|||||||
117
Stepa86
06.09.11
✎
11:31
|
(114) если метод может сам с этим разобраться, то это его проблемы. Отладчиком так же легко ловится при установленной галке.
Если исключительная ситуация такая, что метод нижнего уровня не справляется, то вверх идет каскад ошибок, типа "Нет прав на запись - не могу записать файл - бекап не может быть выполнен - не могу продолжить опасную операцию" |
|||||||
118
Stepa86
06.09.11
✎
11:32
|
+(117) то есть так нужно писать код, чтоб шел такой каскад
|
|||||||
119
Дикообразко
06.09.11
✎
11:32
|
(117) под каскадом ошибок, ты имеешь ввиду потерю данных?
весело |
|||||||
120
Дикообразко
06.09.11
✎
11:33
|
(118) как бы, большинство 1Сов работают преимущественно не только со своим кодом, ты в курсе?
|
|||||||
121
VVi3ard
06.09.11
✎
11:33
|
(106) ты даже пример неправильно написал в процедуре РазДваТри() ты кому сообщаешь об ошибке? Пользователю? Твою процедуру пользователь вызвал? Вот это Сообщить в общих процедурах тоже злит, и меня и пользователей, у тебя в процедуре произошла ошибка ты должен о ней известить НЕ ПОЛЬЗОВАТЕЛЯ! а контекст который тебя вызвал, что будет дальше делать контекст с твоей ошибкой это его дело. То что ты пользователю сообщил ничего не решило.
Дикообразко по тебе видно что ты не когда не работал в большой команде, у тебя весь мир крутится вокруг тебя и все думают как ты. В реальной команде не так, есть правила закрепленные на уровне платформы и грамотный разработчик должен следовать им а не придуманым тобой правилам. А правила такие, получил ошибку которую не можешь обработать вызови исключение. Если пишешь обработку исключений то не забывай отправить на верх исключение по цепочке |
|||||||
122
Stepa86
06.09.11
✎
11:35
|
(117) причем тут потеря данных? если что то нужно сохранить, то в блоке исключения это и сохраняется
(115) ну и форма не закроется и управление не будет возвращено в код, вроде б. А как должно быть по твоему в этой ситуации? |
|||||||
123
VVi3ard
06.09.11
✎
11:36
|
(120) 1С в типовых довольно часто используют ВызватьИсключение().
Зато в самописках гении в каждой попытке пытаются сообщить пользователю "Ура у меня ошибка вот какая я херовая процедура" в то же время вызывающий программист должен использовать эту функцию как процедуру в ответ получая код ошибки. |
|||||||
124
Stepa86
06.09.11
✎
11:36
|
(120) как бэ в типовых примерно так и написано
|
|||||||
125
Дикообразко
06.09.11
✎
11:37
|
(121) ты серьезно экспериментальный код вставляешь в рабочие версии ?
мне жаль твоих коллег мучаются они наверно с тобой страшно подумать как они тебя за глаза называют, а насчет большой команды да, я в команде больше чем из 10 программистов не работал |
|||||||
126
VVi3ard
06.09.11
✎
11:38
|
Что значит эксперементальный :) ???
Это если я в попытке "Сообщить" не написал? |
|||||||
127
Александр_
Тверь 06.09.11
✎
11:38
|
К чему огород городить?
Правильный вариант №2 |
|||||||
128
Дикообразко
06.09.11
✎
11:40
|
(126) экспериментальный это значит экспериментальный,
когда исследуются методы платформы ты наверно свой код по 33 раза переписываешь, правишь туда-сюда? и да в (38) тоже я СообщитьОбОшибке написал |
|||||||
129
VVi3ard
06.09.11
✎
11:41
|
(127) потому что люди которые получили хоть какое то образование в области программирования знают как нужно пользоваться процедурами и как функциями и у них не возникает желание отсупать от общепринятых концепций.
В то время как люди которые за 3 месяца изучили 1Ц и написали рабочий код мнят себя пупами земли и для них нет Стандартов и правил они БОГИ и они могут выбирать как им удобнее делать так и делают. |
|||||||
130
VVi3ard
06.09.11
✎
11:42
|
(128) т.е. для тебя ВызватьИсключение это экспериментальная неизвестная фича платформы которую надо исследовать?
|
|||||||
131
Ненавижу 1С
гуру
06.09.11
✎
11:43
|
(122) как бы C# и делфи закрыли форму и вызвали код в catch
|
|||||||
132
Дикообразко
06.09.11
✎
11:43
|
(130) кхм... я занимаюсь 1С далеко не 3 месяца
|
|||||||
133
VVi3ard
06.09.11
✎
11:45
|
(132) не важно сколько, важно за сколько был получен первый рабочий проект. Потом ощущение всемогущества уже не покидает и уже сложно делать как правильно делают как удобнее в текущий момент.
|
|||||||
134
sttt
06.09.11
✎
11:45
|
просто ребята торчат от "попытка" и от того, что отладчик срабатывает, не мешайте )))
|
|||||||
135
Stepa86
06.09.11
✎
11:46
|
(131) форма то закрылась? мне кажется корректнее форму не закрывать, выдать исключение и ждать от пользователя следующей подлянки в этой форме, а не закрывать ее при приходе исключения, контекстом которого является форма, а не вызывающий ее код.
как работать с исключениям: http://its.1c.ru/db/v8std#content:2149184148:1 это из стандарта 1С, на итс есть копия |
|||||||
136
Дикообразко
06.09.11
✎
11:46
|
(133) тогда попробуй вспомнить как работала попытка на 77,
ну если не сможешь, тогда вспомни как она работала на 8,0 или хотя бы на первых релизах 8.1 |
|||||||
137
Александр_
Тверь 06.09.11
✎
11:47
|
(129) кстати, я не внимательно посмотрел что в примерах указано :(
сейчас еще раз глянул, действительно ЗаполнитьЗначение(а); - это более правильный путь чем а=ЗаполнитьЗначение(); так что я был не прав с ответом. поторопился. |
|||||||
138
Ненавижу 1С
гуру
06.09.11
✎
11:50
|
(135) закрылась, закрылась и это вполне себе корректно
ее закрыло внутренне "вшитое" в нее исключение и передало его дальше |
|||||||
139
VVi3ard
06.09.11
✎
11:51
|
(137) Функция ЗаполнитьЗначение(а) это неправильно, правильно Процедура ЗаполнитьЗначение(а)
|
|||||||
140
Дикообразко
06.09.11
✎
11:52
|
(139) Майкрософт об этом знает?
|
|||||||
141
Александр_
Тверь 06.09.11
✎
11:54
|
(139) ну почему же так категорично?
К примеру, функция может возвращать ложь|истина как указатель на то, что все прошло успешно или нет. Я иногда организую стек ошибок для модуля, а через функции передаю все ли ОК или нет при заполнении чего-то (например при необходимости получить данные из внешних источников). |
|||||||
142
Stepa86
06.09.11
✎
11:57
|
(141) см. (102) и остальной холивар
|
|||||||
143
sttt
06.09.11
✎
11:57
|
(139) где это написано?
|
|||||||
144
Дикообразко
06.09.11
✎
11:58
|
(141)
>>>К примеру, функция может возвращать ложь|истина как указатель на то, что все прошло успешно или нет. он как раз и доказывает, что религиозно верно проверить наличие исключения, т.к. теперь 1С сделала нормальную обработку ошибок т.е. вместо errorLevel = ЗаполнитьЗначение(а); Если errorLevel <> 0 Тогда // обработать ошибку КонецЕсли; нужно писать Попытка ЗаполнитьЗначение(а); Исключение // обработать ошибку КонецЕсли; по мне те же яйца, только в профиль но лучше бы 1С дало бы доступ к стеку ошибок... или он есть? |
|||||||
145
Александр_
Тверь 06.09.11
✎
11:58
|
(142) ну да, не почитал.
Вообще все зависит от ситуации. Универсального единственно правильного решения не существует. Вот и вся правда. |
|||||||
146
Stepa86
06.09.11
✎
11:58
|
(143) в любой книге по качеству написания кода, где то в разделах про именование функций и процедур
|
|||||||
147
Stepa86
06.09.11
✎
12:01
|
(144) яйца может и те же, но 1) достигается единообразие в обработке исключений 2) с потоками данных нужно меньше заморачиваться 3) обработка ошибок стандартными инструментами описана в статьях/книгах, в отличие от своего кода
|
|||||||
148
Дикообразко
06.09.11
✎
12:01
|
(147) суть та же, техническая реализация разная...
еще тупо не все на 82 перешли, что бы с этим заморачиваться |
|||||||
149
Александр_
Тверь 06.09.11
✎
12:03
|
(144) твой пример слишком простой и надуманный. (про как надо)
Более того, при таком подходе будут одни сплошные поытки и исключения. Это как минимум не удобно. Вот к примеру часть кода СостояниеОшибки = ложь; СтруктураДанныхДляВыгрузкиПоНоменклатуре = ПолучитьСтруктуруДанныхДляВыгрузкиПоНоменклатуре(СостояниеОшибки); // активируем свойства товара "качество" СостояниеОшибки = не (не СостояниеОшибки и АктивироватьСвойства(ПолучитьКодСвойстваКачество(),СтруктураДанныхДляВыгрузкиПоНоменклатуре["ТаблицаКачествНоменклатуры"])); // выгружает список штрих-кодов, каждый штрих-код привязывается к номенклатуре, но без // привязки к конкретному размеру и качеству СостояниеОшибки = не (не СостояниеОшибки и ВыгрузитьСписокШтрихКодов(СтруктураДанныхДляВыгрузкиПоНоменклатуре["ТаблицаШтрихКодовНоменклатуры"])); // связываем штрих-код с размером СостояниеОшибки = не (не СостояниеОшибки и СвязатьНоменклатуруШтрихКодРазмер(СтруктураДанныхДляВыгрузкиПоНоменклатуре["ТаблицаШтрихКодовНоменклатуры"])); // связываем штрих-код и качество СостояниеОшибки = не (не СостояниеОшибки и СвязатьНоменклатуруШтрихКодКачество(СтруктураДанныхДляВыгрузкиПоНоменклатуре["ТаблицаШтрихКодовНоменклатуры"])); возврат Не СостояниеОшибки; Это не большой кусок функции. Функции все достаточно универсальные и не надо постоянно, на каждом шаге включать попытки. Более того, не понятно как работать с иерархией ошибок, когда исключение было вызвано на 3й вложенности функций |
|||||||
150
Stepa86
06.09.11
✎
12:03
|
(148) в (38) разве не заметно упрощение?
|
|||||||
151
sttt
06.09.11
✎
12:04
|
(147) встреча в апишных функциях возврат наличие ошибки (errorLevel ) а в переменных данные (а):
errorLevel = ЗаполнитьЗначение(а); |
|||||||
152
Дикообразко
06.09.11
✎
12:04
|
(150) а если ошибок несколько?
сразу так с наскоку сложно оценить последствия такого решения |
|||||||
153
Дикообразко
06.09.11
✎
12:05
|
(149)
>>Более того, не понятно как работать с иерархией ошибок, когда исключение было вызвано на 3й вложенности функций +1 |
|||||||
154
Stepa86
06.09.11
✎
12:07
|
(152) сразу после первой ошибки нельзя сказать сколько еще ошибок, не связанных с первой, если блоки могут работать независимо, то их надо развести по разным проверкам
(151) в случае с апи сложно сгенерить исключение на ихней стороне, потому что непонятно, сможет ли его принять вызывающая сторона, так что там это оправдано |
|||||||
155
Дикообразко
06.09.11
✎
12:10
|
(154)
1. и что тут красивого? Попытка СделатьЧтоТоАдин(Параметры); Исключение СообщитьОбОшибке( ИнформацияОбОшибке() ); КонецПопытки; Попытка СделатьЧтоТоДва(Параметры); Исключение СообщитьОбОшибке( ИнформацияОбОшибке() ); КонецПопытки; Попытка СделатьЧтоТоТри(Параметры); Исключение СообщитьОбОшибке( ИнформацияОбОшибке() ); КонецПопытки; ? |
|||||||
156
sttt
06.09.11
✎
12:11
|
(154) а зачем его генерировать?
|
|||||||
157
mirosh
06.09.11
✎
12:12
|
мне нравится второй вариант, т.к. он более явный. если нужно вернуть несколько значений, можно вернуть структуру.
Правильный вариант №2 |
|||||||
158
Stepa86
06.09.11
✎
12:12
|
(155) если код начинает выглядеть так, то или попытки нужно спускать ниже в функции, или разделить метод на независимые... при использовании статуса код всегда будет выглядеть так, а не только в извращенных случаях
|
|||||||
159
Александр_
Тверь 06.09.11
✎
12:15
|
(158) хреновый путь. Организация стека ошибок, с его обработкой на нужном уровне гораздо элегантнее и проще.
Функция возвращает все ОК или нет. А тому кому нужно обрабатывает ошибку или передает ее обработку выше. |
|||||||
160
Дикообразко
06.09.11
✎
12:15
|
(158) имхо, нормально выглядит
Если Не СделатьЧтоТоАдин(Параметры) Тогда Возврат; КонецЕсли; Если Не СделатьЧтоТоДва(Параметры) Тогда Возврат; КонецЕсли Если Не СделатьЧтоТоТри(Параметры) Тогда Возврат; КонецЕсли |
|||||||
161
Stepa86
06.09.11
✎
12:17
|
(160) а где обработка ошибки то?
|
|||||||
162
Дикообразко
06.09.11
✎
12:17
|
+(160)а можно, так
Отказ = Отказ И СделатьЧтоТоАдин(Параметры, СтруктураОшибок); Отказ = Отказ И СделатьЧтоТоАдДва(Параметры, СтруктураОшибок); Отказ = Отказ И СделатьЧтоТоТри(Параметры, СтруктураОшибок); Если Отказ Тогда ОбработатьОшибки(СтруктураОшибок); КонецЕсли; |
|||||||
163
sttt
06.09.11
✎
12:17
|
+(160)
|
|||||||
164
Дикообразко
06.09.11
✎
12:18
|
(161) например в (162)
если 1С сделает еще и стэк ошибок, то претензии к ним снимутся ;) |
|||||||
165
sttt
06.09.11
✎
12:19
|
(161) если нет такой ситуации как в (23) то смысл обрабатывать
|
|||||||
166
mirosh
06.09.11
✎
12:19
|
(160) + 1, я тоже так делаю.
Обработка исключений нужна для тех случаев, когда невозможно предотвратить ошибку программными средствами. например, какое-нибудь УстановитьСоединение() |
|||||||
167
Stepa86
06.09.11
✎
12:19
|
(164) они рекомендуют не хранить ошибки, а в журнал регистрации писать сразу
|
|||||||
168
Александр_
Тверь 06.09.11
✎
12:20
|
(167) ошибка ошибке рознь.
Не удалось мне подключиться к одной из бд из которых я собираю данные, но мне это и не супер важно, и что? |
|||||||
169
Stepa86
06.09.11
✎
12:21
|
(168) это к чему?
|
|||||||
170
sttt
06.09.11
✎
12:21
|
(166) и то можно посмотреть что вернуло соединение, оно внутри сама все обрабатывает
|
|||||||
171
Дикообразко
06.09.11
✎
12:24
|
А можно (160) модернизировать
Ошибка = СделатьЧтоТоАдин(Параметры); Если ЗначениеЗаполнено(Ошибка) Тогда Возврат Ошибка; КонецЕсли; Ошибка = СделатьЧтоТоДва(Параметры); Если ЗначениеЗаполнено(Ошибка) Тогда Возврат Ошибка ; КонецЕсли; Ошибка = СделатьЧтоТоТри(Параметры); Если ЗначениеЗаполнено(Ошибка) Тогда Возврат Ошибка ; КонецЕсли; |
|||||||
172
Александр_
Тверь 06.09.11
✎
12:25
|
(169) это пофиг что они там рекомендуют, как хочу так и обрабатываю ошибки.
|
|||||||
173
Дикообразко
06.09.11
✎
12:26
|
в принципе (171) мало чем отличается от этого:
Попытка СделатьЧтоТоАдин(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; Попытка СделатьЧтоТоДва(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; Попытка СделатьЧтоТоТри(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; |
|||||||
174
Александр_
Тверь 06.09.11
✎
12:27
|
(173)
вот только не понятно как обрабатывать такой "Возврат(ИнформацияОбОшибке());" |
|||||||
175
Mort
06.09.11
✎
12:28
|
Я вообще за второй вариант, но 1-й заслуживает "жизни" в единственном случае - если никогда не изменяет тип параметра и ничего не возвращает.
Правильный вариант №1 |
|||||||
176
VVi3ard
06.09.11
✎
12:28
|
(162)
Попытка СделатьЧтоТоАдин(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; Попытка СделатьЧтоТоДва(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; Попытка СделатьЧтоТоТри(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; Можно написать так: Попытка СделатьЧтоТоАдин(Параметры); СделатьЧтоТоДва(Параметры); СделатьЧтоТоТри(Параметры); Исключение Возврат(ИнформацияОбОшибке()); КонецПопытки; В этом случае если у тебя исключение произойдет в Адин у тебя не будут в пустую выполнятся функции Два,Три. |
|||||||
177
VVi3ard
06.09.11
✎
12:29
|
Подразумевается что в (176) код который не будет взываться другими процедурами.
|
|||||||
178
Mort
06.09.11
✎
12:30
|
А трюкачить с подобными методами вообще непонятно зачем.
|
|||||||
179
Дикообразко
06.09.11
✎
12:30
|
(176) больше одной ошибки информации не получишь... незачет
см (152) |
|||||||
180
sttt
06.09.11
✎
12:30
|
(173) скорее наверное от стиля зависит, сам пользуюсь редко. когда сильно спишу, когда лень или когда ситуация без контрольная
|
|||||||
181
Александр_
Тверь 06.09.11
✎
12:30
|
(176) а что если в СделатьЧтоТоАдин тоже есть попытка/исключение которые там обрабатываются?
|
|||||||
182
Дикообразко
06.09.11
✎
12:31
|
(181) в исключение СделатьЧтоТоАдин
передавать исключение выше используя метод ВызыватьИсключение такие веяния от 1С, прикинь |
|||||||
183
Дикообразко
06.09.11
✎
12:34
|
(181)
Процедура РазДваТри() а = 1; б = 0; Try с = а/б; Except Raise; EndTry КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка) Try РазДваТри(); Инфо = ИнформацияОбОшибке(); Except Инфо = ИнформацияОбОшибке(); Сообщить(НСтр("ru=""Описание="";en=""Description=""") + Инфо.Описание + """"); Сообщить(НСтр("ru=""ИмяМодуля="";en=""ModuleName=""") + Инфо.ИмяМодуля + """"); Сообщить(НСтр("ru=""НомерСтроки="";en=""LineNumber=""") + Инфо.НомерСтроки); Сообщить(НСтр("ru=""ИсходнаяСтрока="";en=""SourceLine=""") + Инфо.ИсходнаяСтрока + "'"); EndTry КонецПроцедуры |
|||||||
184
Doomer
06.09.11
✎
12:34
|
Ну вы блин даете. Я думал ветка давно уже утонула.
|
|||||||
185
Дикообразко
06.09.11
✎
12:35
|
*(183) на русском
Процедура РазДваТри() а = 1; б = 0; Попытка с = а/б; Исключение ВызватьИсключение; КонецПопытки КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка РазДваТри(); Исключение Инфо = ИнформацияОбОшибке(); Сообщить(НСтр("ru=""Описание="";en=""Description=""") + Инфо.Описание + """"); Сообщить(НСтр("ru=""ИмяМодуля="";en=""ModuleName=""") + Инфо.ИмяМодуля + """"); Сообщить(НСтр("ru=""НомерСтроки="";en=""LineNumber=""") + Инфо.НомерСтроки); Сообщить(НСтр("ru=""ИсходнаяСтрока="";en=""SourceLine=""") + Инфо.ИсходнаяСтрока + "'"); КонецПопытки КонецПроцедуры |
|||||||
186
Александр_
Тверь 06.09.11
✎
12:35
|
(182) если честно, вообще не понимаю о чем сыр-бор :)
Как хочу так и организовываю обработку ошибок. В 1С не очень удобный механизм, это факт. Хочу - делаю свою обработку ошибок. Да и вообще (166) + 1 "Обработка исключений нужна для тех случаев, когда невозможно предотвратить ошибку программными средствами. например, какое-нибудь УстановитьСоединение()" |
|||||||
187
Дикообразко
06.09.11
✎
12:36
|
(186) мыши плакали и кололись, но продолжали жрать кактус (цы)
1С все равно заставит ;) |
|||||||
188
Александр_
Тверь 06.09.11
✎
12:37
|
(187) как? ) как хочу так и делаю.
|
|||||||
189
Александр_
Тверь 06.09.11
✎
12:39
|
(183) такое уродство тянуть эти попытки/исключения через десяток уровней и не запутаться где же кто вызвал исключение. И вообще - какого хрена? )
|
|||||||
190
Дикообразко
06.09.11
✎
12:39
|
(188) они умеют проникать в мозг
|
|||||||
191
Дикообразко
06.09.11
✎
12:39
|
(189) вот и я о том же,
если 1С придумает нормальный стэк, тогда может и взлетит, а так имхо балавство |
|||||||
192
Doomer
06.09.11
✎
12:40
|
И эти люди запрещают мне ковырятся в носу. (с) анекдот про вовочку.
Как можно нафлудить 200 постов на эту тему? |
|||||||
193
sttt
06.09.11
✎
12:41
|
(192) просто вторник ))
|
|||||||
194
Дикообразко
06.09.11
✎
12:43
|
а да кстати, по (0)
имхо, правильно так а = Новый Массив(10); ЗаполнитьЗначение(а); Б=а[0]; и так: а=ВернутьЗаполненныйМассив(); Б=а[0]; |
|||||||
195
nimoid
06.09.11
✎
12:44
|
мне удобно как в (166), (160)
Обычно делаю так: Если НЕ СделатьЧтоТоАдин(Параметры, ОписаниеОшибки) Тогда ЗаписатьОшибку("При попытке выполнения Адин произошла ошибка: " + ОписаниеОшибки); Сообщить("Невозможно выполнить Адин"); // если надо оно Возврат; КонецЕсли; Как вариант, в транзакциях и в попытках .. исключениях: Попытка КакойтоОбъект.Записать(); Если НЕ СделатьЧтоТоАдин(Параметры, ОписаниеОшибки) Тогда ВызватьИсключение ОписаниеОшибки; КонецЕсли; Если НЕ СделатьЧтоТоДва(Параметры, ОписаниеОшибки) Тогда ВызватьИсключение ОписаниеОшибки; КонецЕсли; Исключение ЗаписатьОшибку("При попытке выполнения чего-то-там-важного произошла ошибка: " + ОписаниеОшибки); Сообщить("Невозможно выполнить Адин"); // если надо Возврат; КонецПопытки по голосовалке - зависит от ситуации |
|||||||
196
VVi3ard
06.09.11
✎
12:48
|
(188) Почитай (129)
(183) Зачем тянуть, ты взывал функцию, она взывала исключение ты уже вероятно не сможешь продолжить работу, если ты пишешь общую функцию то ты тоже вызываешь исключение из за того что произошел сбой в чужой функции. тупо выдаётся ошибка. Всё что от тебя требуется если пишешь общую Функцию помнить что ты не один и быть вежливым с чужими исключениями, и не забывать про свои. (195) Попытка СделатьЧтоТоАдин(Параметры); СделатьЧтоТоДва(Параметры); СделатьЧтоТоТри(Параметры); Исключение Инфо = ИнформацияОбОшибке(); Сообщить("Описание='" + Инфо.Описание + "'"); Сообщить("ИмяМодуля='" + Инфо.ИмяМодуля + "'"); Сообщить("НомерСтроки=" + Инфо.НомерСтроки); Сообщить("ИсходнаяСтрока='" + Инфо.ИсходнаяСтрока + "'"); Возврат(ИнформацияОбОшибке()); КонецПопытки; (Опять же если это не экспортная процедура, например обработчик кнопки) |
|||||||
197
Дикообразко
06.09.11
✎
12:52
|
(196) ситуации разные бывают, задачи тоже
иногда нужно выполнить код несмотря на ошибки |
|||||||
198
VVi3ard
06.09.11
✎
13:00
|
(197) Мы тут обсуждаем то к чему надо стремится, жизнь и платформа подкидывают задачки которые решить иначе как "неправильно" нельзя например из моего кода:
Попытка пОбъект.ВнешнийКлюч = Строка(ВнешнийКлюч); Исключение КонецПопытки; Может быть передан произвольный объект нужно заполнить внешний ключ узнать о наличии свойства малой кровью нельзя, так приходится делать и есть множество других ситуаций но важно стремится к правильному коду хотя бы в общих моментах. |
|||||||
199
Дикообразко
06.09.11
✎
13:03
|
(198) в любом случае это лишь техническая реализация...
идеология обработки ошибок абсолютно одинаковая |
|||||||
200
izekia
06.09.11
✎
13:05
|
(198) о том и речь, что обработка исключений должна быть на своем месте ... а не заменять обработку ошибки в случае возможного продолжения выполнения программы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |