OberonCore
https://forum.oberoncore.ru/

Модификация механизма исключений для PureBuilder
https://forum.oberoncore.ru/viewtopic.php?f=93&t=3195
Страница 3 из 3

Автор:  Сергей Прохоренко [ Среда, 09 Февраль, 2011 10:09 ]
Заголовок сообщения:  Финализация аварийной процедуры

:idea:
До меня, наконец, довели простую, но важную мысль: необходим механизм финализации аварийной продедуры/функции! Другими словами, прежде, чем уйти в небытие, аварийная процедура должна "подчистить за собой", в частности, освободить системные ресурсы. Делать это должна она сама, так как только она обладает необходимой для этого информацией.

Поэтому в любой процедуре/функции, которая может вызвать исключение, должен быть блок finally, код в котором будет гарантированно исполнен вне зависимости от того, возникло исключение или нет. Например, если в процедуре/функции был открыт файл, то независимо от того, возникнет исключение или нет, файл все равно нужно в конце работы закрыть. В таком случае, код, отвечающий за закрытие файла целесообразно разместить в блоке finally.

Автор:  Сергей Прохоренко [ Среда, 09 Февраль, 2011 21:43 ]
Заголовок сообщения:  Re: Финализация аварийной процедуры

Сергей Прохоренко писал(а):
До меня, наконец, довели простую, но важную мысль: [b]необходим механизм финализации аварийной продедуры/функции...

:?

Теперь мне больше нравится другое решение:

При завершении функции/процедуры (независимо от того, возникло ли исключение) должны быть автоматически освобождены все ресурсы, занятые этой функцией/процедурой. Например, должны быть закрыты открытые в ней файлы. Ответственность за это возлагается на компилятор, действие которого аналогично действию конструкции using в C#.

Естественно, блок finally теперь не нужен.

Автор:  Валерий Лаптев [ Пятница, 11 Февраль, 2011 08:24 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.

Автор:  Сергей Прохоренко [ Пятница, 11 Февраль, 2011 10:58 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Валерий Лаптев писал(а):
Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.


Я совершенно против такого подхода. Это все равно как заставлять студентов вместо while end и if elsif else end использовать goto - чтобы студенты "понюхали порорху". Привыкать нужно к хорошему, а плохого в любом случае будет предостаточно, когда они перйдут на "промышленные" языки. Никто же не требует, чтобы начинающие брали на себя сборку мусора, контроль за выходом индекса за границы массива, контроль типов, а перепоручают это всё компилятору и среде времени исполнения.

Корни такого подхода преподавателей мне понятны: за неимением хороших учебных проектов, на которых студентам можно потренироваться, им предлагается вручную повторить то, что давно реализовано в компиляторах и библиотеках. При этом им явным образом запрещают пользоваться удобными и надежными инструментами. Будущим системным программистам, может быть, это иногда полезно - чтобы лучше понимать кухню. Но есть риск, что студенты так и не освоят нормальные инструменты программирования, а извращения "промышленных" языков будут воспринимать как должное. Кстати, ненавязчивый отказ от finally в пользу using даже в "промышленном" C# - это аргумент в пользу моей позиции.

Автор:  Сергей Прохоренко [ Пятница, 11 Февраль, 2011 11:35 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!

Автор:  Виктор О [ Пятница, 11 Февраль, 2011 16:51 ]
Заголовок сообщения:  Re: Финализация аварийной процедуры

Сергей Прохоренко писал(а):

Теперь мне больше нравится другое решение:

При завершении функции/процедуры (независимо от того, возникло ли исключение) должны быть автоматически освобождены все ресурсы, занятые этой функцией/процедурой. Например, должны быть закрыты открытые в ней файлы. Ответственность за это возлагается на компилятор, действие которого аналогично действию конструкции using в C#.

Естественно, блок finally теперь не нужен.

Кажется, это противоречит ООП (не то, чтобы я сторонник, так, просто замечаю),
поскольку ООП организует программу не иерархически, а хаотически.

Автор:  Сергей Прохоренко [ Пятница, 11 Февраль, 2011 18:08 ]
Заголовок сообщения:  Re: Финализация аварийной процедуры

Тем хуже для ООП. :wink:
Тем более, что там уже, кажется, начался разброд и шатания.

А как Вы оцениваете саму идею?

Автор:  Валерий Лаптев [ Пятница, 11 Февраль, 2011 18:11 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Я склонен к первому, а не второму. Для начинающих - надо все писать явно и ручками. Если блок finally обязателен, то и думать, что туда писать - обязательно. А думать для начинающего - всегда хорошо.


Корни такого подхода преподавателей мне понятны: за неимением хороших учебных проектов, на которых студентам можно потренироваться, им предлагается вручную повторить то, что давно реализовано в компиляторах и библиотеках. При этом им явным образом запрещают пользоваться удобными и надежными инструментами. Будущим системным программистам, может быть, это иногда полезно - чтобы лучше понимать кухню. Но есть риск, что студенты так и не освоят нормальные инструменты программирования, а извращения "промышленных" языков будут воспринимать как должное. Кстати, ненавязчивый отказ от finally в пользу using даже в "промышленном" C# - это аргумент в пользу моей позиции.

Насчет учебных проектов - тут вы не правы. Есть учебные проекты. Хорошие. Но делают их - единицы. Реально единицы.
Вот лабы по системному ПО мне реально сделали только 3 человека в срок. А тут как раз хороший учебный проект из 3 программ: интерпретатор виртуальной машины, ассемблер и командный отладчик. Как раз на пару тысяч строк тянет.
Либо не могут, либо просто не хотят, считая это - фигней, которой препод заставляет заниматься.
А у нас даже в соседней конторе для своих разработок создали интегрированную среду с виртуальной машиной. И горя не знают... :)
А единица - это пацан, который и лабает у меня структурный редактор. Вот ему - ИНТЕРЕСНО!

Автор:  Валерий Лаптев [ Пятница, 11 Февраль, 2011 18:12 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Сергей Прохоренко писал(а):
Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!

Это - не аргумент. Точно так же небезопасен блок, сформированный компилятором.

Автор:  Сергей Прохоренко [ Пятница, 11 Февраль, 2011 18:34 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Валерий Лаптев писал(а):
Сергей Прохоренко писал(а):
Вот еще один аргумент против finally.
Если во время выполнения блока finally возникнет исключение, то что тогда делать? Эта проблема не имеет хорошего решения, то есть сам по себе блок finally небезопасен!

Это - не аргумент. Точно так же небезопасен блок, сформированный компилятором.

Компилятор никогда не воткнет в этот блок команды, которые могут вызвать исключения, а от программиста всего можно ожидать.

Автор:  Александр Шостак [ Пятница, 11 Февраль, 2011 19:42 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Компилятор вообще ничего сформировать не может. Корректная финализация - суть тоже алгоритм, а не банальный вызов мистической безошибочной функции CloseAndFinalizeAllResources.

Автор:  Сергей Прохоренко [ Суббота, 12 Февраль, 2011 16:10 ]
Заголовок сообщения:  Re: Модификация механизма исключений для PureBuilder

Александр Шостак писал(а):
Компилятор вообще ничего сформировать не может. Корректная финализация - суть тоже алгоритм, а не банальный вызов мистической безошибочной функции CloseAndFinalizeAllResources.


Может. Вот пример: http://www.quizful.net/interview/csharp/using-keyword

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/