Про катастрофу "Италии" снят фильм "Красная палатка". Если кто не знает - для итальянского проката музыка к фильму была написана Эннио Морриконе, а для Советского (фильм совместный) - Александром Зацепиным, который 10 марта 2026 года отметил 100-летие. Сам он музыку к этому фильму считает одним из своих лучших произведений.
Вспомнилась программа под MS DOS, в которой появлялась картинка с дядькой, громко посылающим на три буквы через PC speaker, и нельзя было никак это прервать - даже нажатие Ctrl + Alt + Del было заблокировано. Некоторые шутники вставляли запуск этой гадости в автозагрузку перед выключением компьютера.
Помню времена, когда я ставил кассету в магнитофон и на звук за полминуты понимал, какая это игра, и даже примерно какая ее часть, чтобы отмотать к началу загрузки. Звуки загрузки экранов как раз запоминались лучше всего.
Огромное спасибо за приступ ностальгии :-) Все части игр про Уолли я проходил когда-то на "железном" Спектруме еще в 90-е. Everyone's a Wally мне нравилась больше всего, как раз из-за того, что можно было играть за всех персонажей - тогда эта возможность воспринималась как "взрыв мозга" в хорошем смысле :-) Ну и я не припомню, чтобы хоть в одной другой игре для Спектрума было что-то подобное.
В Вашей статье на сайте есть небольшая опечатка - кусок ссылки попал в текст:
Параллельно я допиливал свой перевод. В своё время я сокрушался о том, как плохо переведён Pyjamarama-клон Sceptre of Bagdad(/games/sceptreofbagdad/)
Худшее, что у вас может возникнуть с исключениями -- это то, что вы его не поймаете
Именно. Программа в таком случае запросто может завершить работу. Например, когда из программы на C# (WPF) вызывается COM-объект, написанный на C++. Мне пришлось как-то работать с такой связкой. Все возвращаемые коды ошибок HRESULT из COM-объекта в программе на C# обрабатываются как исключения. И не дай бог какой-то код ошибки не обработать - стоит COM-объекту его вернуть, как программа просто молча закрывается.
Чем дальше, тем больше убеждаюсь в том, что исключения не любят те разработчики, которым пока не хватает опыта.
Невозможно быть опытным во всех возможных областях. Как минимум, это дано не всем :-)
Есть у меня подозрение, что запреты на использование исключений в каких-то компаниях могут быть связаны с тем, что им проще и дешевле ввести ограничения, чем ожидать, что все имеющиеся программисты достаточно опытны. Ну или нанимать более дорогих программистов вместо имеющихся. Текучку кадров тоже никто не отменял, особенно в больших компаниях.
И ключевым методом здесь как раз становится тот самый RAII, речь о котором и идет в этой посредственного качества статье.
Не очень понимаю, что такое "вычислительный код" - все компьютеры, в конечном счете, занимаются вычислениями, больше они ничего не умеют :-) А у Вас в каких случаях исключения активно используются?
Ну так и с исключениями можно наступить на грабли. Допустим, вызываю я создание чьего-то чужого объекта, который никакими исключениями не кидается и никогда не кидался. А потом, по прошествии скольки-то лет, автор этого объекта вдруг решил, что теперь надо бы кидать исключения в каких-то случаях. Причем, не в любых и не очень очевидных. Это тоже вполне себе бомба замедленного действия. И такое может происходить даже в пределах одной компании. Даже, подозреваю, вероятность такого даже выше, чем при использовании библиотек из сторонних компаний - нормальные авторы обычно в документации пишут, кидают ли они исключения. Хотя, есть у меня подозрения, что авторы разные бывают :-)
конструируется объект, в процессе выясняется, что создать в нормальном состоянии его нельзя и создание нужно прервать
Таких ситуаций я стараюсь избегать. Некоторые способы перечислены в комментарии. Например, в конструкторе делать только заведомо ту часть инициализации, которая исключениями априори кидаться не может. А более "опасную" часть инициализации делать вызовом отдельного метода. Возможно, для кого-то это усложнение, не спорю.
Может ваши разработки есть в OpenSource?
В том, что есть в открытом доступе, подобные темы не затрагиваются. Если посмотрите мои статьи, там есть ссылки на кое-какие исходники, но там, в основном, код для Arduino - какие уж тут исключения :-)
Изредка бывает, что приходится использовать чужие библиотеки или готовые классы, которые кидают исключения, ради них приходится использовать их "отлов".
Знаете, я не очень готов это как-то подробно обсуждать. На эту тему достаточно много материалов готовых можно найти. Я уже написал, что сам привык работать без обработки исключений. И мне не нравится, когда вызываешь чужой код, а он роняет мою программу в непредсказуемый момент при обработке каких-то входных данных (и не всегда очевидно, каких именно). Окружать вызовы чужого кода блоками try/catch/except мне тоже не нравится. Реального преимущества использования исключений в моей практике я не видел - ни с точки зрения быстродействия, ни удобства написания кода. Свою точку зрения я никому не навязываю, тем более, что она основана, скорее, на "нравится/не нравится". Но раз есть другие люди, которым также неудобно или не хочется работать с обработкой исключений, я считаю, что это не просто какая-то блажь.
P.S. И уж тем более я не собирался заниматься морализаторством.
Одно дело - явно видеть, как и где проверяются возвращаемые из вызовов коды ошибок, а другое - сплошной код без проверок, но нужно все время помнить, что в любой строке может быть выкинуто исключение, которое может быть отловлено вообще не здесь, а в вызывающей процедуре. И что даже создание экземпляра класса может выкинуть исключение.
Никакого пиетета не было, а лишь констатация факта, что и в крупных компаниях иногда вынуждены отказываться от использования исключений в конструкторах. Причины, естественно, на то имеются.
Стиль написания кода при использовании исключений все же серьезно отличается, и это влияет и на читабельность кода.
Про катастрофу "Италии" снят фильм "Красная палатка". Если кто не знает - для итальянского проката музыка к фильму была написана Эннио Морриконе, а для Советского (фильм совместный) - Александром Зацепиным, который 10 марта 2026 года отметил 100-летие. Сам он музыку к этому фильму считает одним из своих лучших произведений.
Интересно, как его в начале 90-х создали. Звуковые карты, если я правильно помню, всё-таки позже появились.
Точно! Уже больше 30 лет прошло с тех пор :-)
Вспомнилась программа под MS DOS, в которой появлялась картинка с дядькой, громко посылающим на три буквы через PC speaker, и нельзя было никак это прервать - даже нажатие Ctrl + Alt + Del было заблокировано. Некоторые шутники вставляли запуск этой гадости в автозагрузку перед выключением компьютера.
Здесь надо было во время загрузки еще и кнопки нажимать, чтобы игра корректно загрузилась?
Помню времена, когда я ставил кассету в магнитофон и на звук за полминуты понимал, какая это игра, и даже примерно какая ее часть, чтобы отмотать к началу загрузки. Звуки загрузки экранов как раз запоминались лучше всего.
Огромное спасибо за приступ ностальгии :-) Все части игр про Уолли я проходил когда-то на "железном" Спектруме еще в 90-е. Everyone's a Wally мне нравилась больше всего, как раз из-за того, что можно было играть за всех персонажей - тогда эта возможность воспринималась как "взрыв мозга" в хорошем смысле :-) Ну и я не припомню, чтобы хоть в одной другой игре для Спектрума было что-то подобное.
В Вашей статье на сайте есть небольшая опечатка - кусок ссылки попал в текст:
Я и не говорю, что это проблема исключений. Каждым инструментом нужно пользоваться со знанием дела, вот и всё. К исключениям это тоже относится.
Насчёт того, что это лучше, приходится объяснять клиенту, который ни разу не программист, а программа у него на глазах взяла и закрылась.
Скажем так - обработкой звука и видео мне действительно в части задач приходится заниматься.
Кстати, требования к производительности тоже могут накладывать ограничения на использование исключений.
Именно. Программа в таком случае запросто может завершить работу. Например, когда из программы на C# (WPF) вызывается COM-объект, написанный на C++. Мне пришлось как-то работать с такой связкой. Все возвращаемые коды ошибок HRESULT из COM-объекта в программе на C# обрабатываются как исключения. И не дай бог какой-то код ошибки не обработать - стоит COM-объекту его вернуть, как программа просто молча закрывается.
Невозможно быть опытным во всех возможных областях. Как минимум, это дано не всем :-)
Есть у меня подозрение, что запреты на использование исключений в каких-то компаниях могут быть связаны с тем, что им проще и дешевле ввести ограничения, чем ожидать, что все имеющиеся программисты достаточно опытны. Ну или нанимать более дорогих программистов вместо имеющихся. Текучку кадров тоже никто не отменял, особенно в больших компаниях.
С этим я согласен на все 100500.
Не очень понимаю, что такое "вычислительный код" - все компьютеры, в конечном счете, занимаются вычислениями, больше они ничего не умеют :-) А у Вас в каких случаях исключения активно используются?
Ну так и с исключениями можно наступить на грабли. Допустим, вызываю я создание чьего-то чужого объекта, который никакими исключениями не кидается и никогда не кидался. А потом, по прошествии скольки-то лет, автор этого объекта вдруг решил, что теперь надо бы кидать исключения в каких-то случаях. Причем, не в любых и не очень очевидных. Это тоже вполне себе бомба замедленного действия. И такое может происходить даже в пределах одной компании. Даже, подозреваю, вероятность такого даже выше, чем при использовании библиотек из сторонних компаний - нормальные авторы обычно в документации пишут, кидают ли они исключения. Хотя, есть у меня подозрения, что авторы разные бывают :-)
Таких ситуаций я стараюсь избегать. Некоторые способы перечислены в комментарии. Например, в конструкторе делать только заведомо ту часть инициализации, которая исключениями априори кидаться не может. А более "опасную" часть инициализации делать вызовом отдельного метода. Возможно, для кого-то это усложнение, не спорю.
В том, что есть в открытом доступе, подобные темы не затрагиваются. Если посмотрите мои статьи, там есть ссылки на кое-какие исходники, но там, в основном, код для Arduino - какие уж тут исключения :-)
Нет, такого я не делаю.
Изредка бывает, что приходится использовать чужие библиотеки или готовые классы, которые кидают исключения, ради них приходится использовать их "отлов".
Знаете, я не очень готов это как-то подробно обсуждать. На эту тему достаточно много материалов готовых можно найти. Я уже написал, что сам привык работать без обработки исключений. И мне не нравится, когда вызываешь чужой код, а он роняет мою программу в непредсказуемый момент при обработке каких-то входных данных (и не всегда очевидно, каких именно). Окружать вызовы чужого кода блоками try/catch/except мне тоже не нравится. Реального преимущества использования исключений в моей практике я не видел - ни с точки зрения быстродействия, ни удобства написания кода. Свою точку зрения я никому не навязываю, тем более, что она основана, скорее, на "нравится/не нравится". Но раз есть другие люди, которым также неудобно или не хочется работать с обработкой исключений, я считаю, что это не просто какая-то блажь.
P.S. И уж тем более я не собирался заниматься морализаторством.
Можно ни о чем не думать. Особенно когда программа выполняет недопустимую операцию на машине у клиента, а ты потом пытаешься понять, почему.
Лично для меня код без исключений более нагляден.
Одно дело - явно видеть, как и где проверяются возвращаемые из вызовов коды ошибок, а другое - сплошной код без проверок, но нужно все время помнить, что в любой строке может быть выкинуто исключение, которое может быть отловлено вообще не здесь, а в вызывающей процедуре. И что даже создание экземпляра класса может выкинуть исключение.
Возможно, это дело привычки и опыта.
Никакого пиетета не было, а лишь констатация факта, что и в крупных компаниях иногда вынуждены отказываться от использования исключений в конструкторах. Причины, естественно, на то имеются.
Стиль написания кода при использовании исключений все же серьезно отличается, и это влияет и на читабельность кода.