Re[7]: try ... catch плодит говнокод
От: TG  
Дата: 14.02.20 10:30
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

TG>>Про коды ошибок и исключения см. тут: https://rsdn.org/forum/philosophy/1500888.1
Автор: Sinclair
Дата: 22.11.05
и https://rsdn.org/forum/philosophy/1512953.1
Автор: IT
Дата: 30.11.05
.

VYR> либо занимайся ООП при оработке ошибок (даже вложеную цепочку можно построить)
VYR>либо гадай на каком этапе была ошибка, что в try...catch невозможно узнать без костылей...

Исключения типизированные, есть stack trace. Чего еще не хватает?
Re[4]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 10:38
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

Если это отсылка к C++, то преимущества заканчиваются там довольно быстро как только объекты становятся членами класса (ссылками). Да, проблема, решается с помощью всяческих примитивов, но обилие их количества и семантики едва ли можно назвать выигрышем в чистом виде.
Re[8]: try ... catch плодит говнокод
От: vvv848165@ya.ru  
Дата: 14.02.20 10:44
Оценка:
Здравствуйте, TG, Вы писали:

TG>Здравствуйте, vvv848165@ya.ru, Вы писали:


TG>>>Про коды ошибок и исключения см. тут: https://rsdn.org/forum/philosophy/1500888.1
Автор: Sinclair
Дата: 22.11.05
и https://rsdn.org/forum/philosophy/1512953.1
Автор: IT
Дата: 30.11.05
.

VYR>> либо занимайся ООП при оработке ошибок (даже вложеную цепочку можно построить)
VYR>>либо гадай на каком этапе была ошибка, что в try...catch невозможно узнать без костылей...

TG>Исключения типизированные, есть stack trace. Чего еще не хватает?

вот имено стек вызовов а не ошибок.
а где в функуии если вложеные функции одинаковы — облом
Re[5]: try ... catch плодит говнокод
От: Evgeny.Panasyuk Россия  
Дата: 14.02.20 10:46
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Если это отсылка к C++, то преимущества заканчиваются там довольно быстро как только объекты становятся членами класса (ссылками).


О чём ты?
class Widget
{
    File x;
...
};


MA>Да, проблема, решается с помощью всяческих примитивов, но обилие их количества и семантики едва ли можно назвать выигрышем в чистом виде.


То о смарт-поинтерах? Базовых всего два, если лень и много ресурсов — можно вообще знать только один.
В большинстве случаев они не нужны — ну то есть если взять места в программе где создаются объекты, и посчитать в скольких случаях нужны какие-либо смарт-поинтеры — то окажется что это доли процента от общего числа, а в подавляющем большинстве случаев происходит так как в Widget выше
Re[9]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 11:01
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

TG>>Исключения типизированные, есть stack trace. Чего еще не хватает?

VYR>вот имено стек вызовов а не ошибок.
VYR>а где в функуии если вложеные функции одинаковы — облом

Честно говоря, по моему мнению (не везде это так), в 99% достаточно знать имя файла/номер строки, где сработал ассерт или выброшена ошибка. Наличие стэктрэйса в дотнете это вообще как чит. Если этой информации не достаточно для устранения ошибки сразу — то вероятнее всего, в любом случае понадобится воспроизведение и/или дебаг сессия. Создание автоматических дампов памяти не ко всему применим и не на все вопросы отвечают. Как бывают и другие особенности в проектах, где это вообще всё бесполезный груз.

Что бы стек вызовов был прозрачным — надо научиться делать "rethrow" правильно.
Re: try ... catch плодит говнокод
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 14.02.20 11:21
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Может подскажите как меньшими силами обходит похожие грабли ???

Сделать обработку исключения там, где ты можешь его обработать или не обрабатывать совсем. Ловить исключение и писать в лог это неверно.
Sic luceat lux!
Re[6]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 11:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>О чём ты?

EP>
EP>class Widget
EP>{
EP>    File x;
EP>...
EP>};
EP>

Это же аггрегация вроде. Я о полях вида ptr<T> разного толка. Такое тоже имеет место быть, но я такое вижу крайне редко (ну кроме случаев когда вместо File простые структуры).

EP>То о смарт-поинтерах? Базовых всего два, если лень и много ресурсов — можно вообще знать только один.

EP>В большинстве случаев они не нужны — ну то есть если взять места в программе где создаются объекты, и посчитать в скольких случаях нужны какие-либо смарт-поинтеры — то окажется что это доли процента от общего числа, а в подавляющем большинстве случаев происходит так как в Widget выше
Ну, я вижу скорее обратное: почти всё завязано на какие-нибудь обертки. это от объектов-прокси IPC, параметры-колбэки и т.п. И их не всего два, а в каждом огороде свой. (Хотя всё и сдвинулось в сторону стандартов — но стандарт не может сдвинуть специального вида ссылки, к примеру если это внешняя GC ссылка, которая обязательно обернута в свой смарт поинтер.)
Плюс это всё сдобрено в перемешку с std::move, который нужно или не нужно применять приходится решать в конкретном месте, не потому что лень знать, а потому что из сигнатуры не всегда ясно, чего ожидают от метода.

На фоне всех этих трюков в C++, ручное управление ресурсами в C#, лично для меня не выглядит чем-то более сложным.

Я понимаю, что это всё довольно субьективно, и я не отрицаю, что объективно механизмов в C++ больше, они мощнее и при должном упорстве получается красиво. Но субьективизм...
Re: try ... catch плодит говнокод
От: vvv848165@ya.ru  
Дата: 14.02.20 12:10
Оценка:
а почему из finally аргумент Exception не доступен???
А ведь нужен иногда бывает (например чтобы посмотреть какая ошибка и не тргать лишние обьекты)
прям ...
Re[2]: try ... catch плодит говнокод
От: Maniacal Россия  
Дата: 14.02.20 12:24
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>а почему из finally аргумент Exception не доступен???

VYR>А ведь нужен иногда бывает (например чтобы посмотреть какая ошибка и не тргать лишние обьекты)
VYR>прям ...

Потому что исключение должно обрабатываться в блоке catch. А в finally код обрабатывается вне зависимости от того было исключение или нет.
Re[3]: try ... catch плодит говнокод
От: vvv848165@ya.ru  
Дата: 14.02.20 12:52
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Потому что исключение должно обрабатываться в блоке catch. А в finally код обрабатывается вне зависимости от того было исключение или нет.

что дополнительно неудобно...
вспомнил первый курс универа — тогда про него читал (C++Builder) и удивлялся как он так работает...
с тех пор почти ничего не поменялось...

для состояний внутри класса (даже если не конечным автоматом) — это просто кашмар как неудобно...
Re[4]: try ... catch плодит говнокод
От: Maniacal Россия  
Дата: 14.02.20 13:06
Оценка: 3 (1) +1
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>для состояний внутри класса (даже если не конечным автоматом) — это просто кашмар как неудобно...

Потому исключение и называется исключением. Не предусмотренная алгоритмом внештатная ситуация.
Re[7]: try ... catch плодит говнокод
От: Evgeny.Panasyuk Россия  
Дата: 14.02.20 13:06
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

EP>>О чём ты?

EP>>
EP>>class Widget
EP>>{
EP>>    File x;
EP>>...
EP>>};
EP>>

MA> Это же аггрегация вроде.

Это больше 99% случаев.

MA>Я о полях вида ptr<T> разного толка.


А это соответственно меньше 1%.

MA>Такое тоже имеет место быть, но я такое вижу крайне редко


Это очень странно, ибо является вариантом по-умолчанию.

MA>(ну кроме случаев когда вместо File простые структуры).


Ну вот File как раз таким образом используется прямо влёт. В чём проблема-то?

EP>>В большинстве случаев они не нужны — ну то есть если взять места в программе где создаются объекты, и посчитать в скольких случаях нужны какие-либо смарт-поинтеры — то окажется что это доли процента от общего числа, а в подавляющем большинстве случаев происходит так как в Widget выше

MA> Ну, я вижу скорее обратное: почти всё завязано на какие-нибудь обертки. это от объектов-прокси IPC, параметры-колбэки и т.п.

Ну вот например std::vector или std::function — ты к чему относишь? К смарт-поинтерам?

MA>Плюс это всё сдобрено в перемешку с std::move, который нужно или не нужно применять приходится решать в конкретном месте, не потому что лень знать


Обычно если забыть move, будет либо ошибка компиляции, либо лишняя копия.

MA>а потому что из сигнатуры не всегда ясно, чего ожидают от метода.


Пример в студию.

MA>На фоне всех этих трюков в C++, ручное управление ресурсами в C#, лично для меня не выглядит чем-то более сложным.


Все эти "трюки" — два притопа, три прихлопа, и не нужно от забора и до обеда вручную управлять ресурсами.

MA>Я понимаю, что это всё довольно субьективно, и я не отрицаю, что объективно механизмов в C++ больше, они мощнее и при должном упорстве получается красиво. Но субьективизм...


Фишка в том что не просто красиво, а ещё и просто, а-ля class Widget{ File x; ... };.
Проблема обычно в том, что действительно есть код где совершенно необоснованное засилье ptr<T>, буквально на ровном месте. Обычно так происходит когда кто-то переходит с управляемых языков, и начинает везде лепить привычные new, потом задалбывается управлять вручную, ещё и огребает проблем с exception safety прям как ТС, и узнаёт про спасительные смарт поинтеры — с этого момента всё и оборачивается в ptr<T>.
Re[5]: try ... catch плодит говнокод
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 14.02.20 13:32
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Еслиб исключений небыло а только возвращались бы коды ошибок — то было бы подругому...

Посмотри как это "по другому" в Go происходит. Мягко говоря, борода из обработчиков ошибок там длинее кода основного потока исполнения.

VYR>и борода былабы меньше и писалась она бы в нужных местах...

Ошибаешься.
Sic luceat lux!
Re[2]: try ... catch плодит говнокод
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 14.02.20 14:34
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>а почему из finally аргумент Exception не доступен???

VYR>А ведь нужен иногда бывает (например чтобы посмотреть какая ошибка и не тргать лишние обьекты)
VYR>прям …

Если хочешь в finally смотреть Exception то создай переменную вне блока try и устанавливать в catch.

finally хорош тем, что он выполняется и после return, что иногда удобно, когда уже правишь чей то год с кучей return
и солнце б утром не вставало, когда бы не было меня
Re[8]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 19:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это больше 99% случаев.

MA>>Я о полях вида ptr<T> разного толка.
EP>А это соответственно меньше 1%.
Ну ты просто не можешь аггрегировать объекты которыми не владеешь. Статистики у меня нет. Если ты получил смарт-поинтер — то с ним и живёшь.

EP>>>В большинстве случаев они не нужны — ну то есть если взять места в программе где создаются объекты, и посчитать в скольких случаях нужны какие-либо смарт-поинтеры — то окажется что это доли процента от общего числа, а в подавляющем большинстве случаев происходит так как в Widget выше

MA>> Ну, я вижу скорее обратное: почти всё завязано на какие-нибудь обертки. это от объектов-прокси IPC, параметры-колбэки и т.п.
EP>Ну вот например std::vector или std::function — ты к чему относишь? К смарт-поинтерам?
Не понимаю к чему вопрос. Нет, под смарт-поинтерами я понимаю типы, которые так или иначе оборачивают указатели на объекты наделяя их порою самыми невообразимыми свойствами.

MA>>Плюс это всё сдобрено в перемешку с std::move, который нужно или не нужно применять приходится решать в конкретном месте, не потому что лень знать

EP>Обычно если забыть move, будет либо ошибка компиляции, либо лишняя копия.
MA>>а потому что из сигнатуры не всегда ясно, чего ожидают от метода.
EP>Пример в студию.
Возможно ты прав. Разматывать историю честно говоря сейчас лень, более того, проверить даст ли по рукам компилятор того времени я сейчас всё равно не смогу, и от меня это в любом случае потребует больших временных затрат.

MA>>На фоне всех этих трюков в C++, ручное управление ресурсами в C#, лично для меня не выглядит чем-то более сложным.

EP>Все эти "трюки" — два притопа, три прихлопа, и не нужно от забора и до обеда вручную управлять ресурсами.
В C#, в отлиии от C++ — в ручную необходимо управлять только непосредственно ресурсами, и управление ими по большому счету сосредотачивается в библиотечном коде. В C++ полуручник всегда рядом в перемешку с голыми указателями.

EP>Фишка в том что не просто красиво, а ещё и просто, а-ля class Widget{ File x; ... };.

Я вообще абсолютно за вот эту вот C++-сную возможность свободно объявлять свои типы данных и оперировать с ними как с value-типами, а не определять способ их инстанцирования в декларации (как в C#). Более того, в C# структуры не эквиваленты классам (ну, к примеру, для первых нет наследования) — соответственно одно другое не заменяет (хоть это в мире C# и не является проблемой). Но ложка дегтя в C++ больше.

EP>Проблема обычно в том, что действительно есть код где совершенно необоснованное засилье ptr<T>, буквально на ровном месте. Обычно так происходит когда кто-то переходит с управляемых языков, и начинает везде лепить привычные new, потом задалбывается управлять вручную, ещё и огребает проблем с exception safety прям как ТС, и узнаёт про спасительные смарт поинтеры — с этого момента всё и оборачивается в ptr<T>.

Это не тот случай. В своей жизни, кроме нескольких собственных проектв, — я не сталкивался с кодом C++ с экзепшнами — но, это просто случайность.
Re[4]: try ... catch плодит говнокод
От: T4r4sB Россия  
Дата: 14.02.20 19:40
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA> Проблема, в том, что одни люди не понимают как работать с исключениями, а вторые — не совсем еще осознали, что GC лишь помогает, а детерминированное управление ресурсами там же где и раньше — на ваших плечах.


Ну и где оно, это детерминированное управление ресурсами? В С++ есть деструкторы с гарантией вызова. А в жабошарпах? Ну юзинг есть, но он не универсален. Что, ручками, как в старые добрые времена?
Re[5]: try ... catch плодит говнокод
От: fmiracle  
Дата: 14.02.20 20:26
Оценка: +1 :)
Здравствуйте, T4r4sB, Вы писали:

MA>> Проблема, в том, что одни люди не понимают как работать с исключениями, а вторые — не совсем еще осознали, что GC лишь помогает, а детерминированное управление ресурсами там же где и раньше — на ваших плечах.


TB>Ну и где оно, это детерминированное управление ресурсами? В С++ есть деструкторы с гарантией вызова. А в жабошарпах? Ну юзинг есть, но он не универсален. Что, ручками, как в старые добрые времена?

А автор что написал? См. выделеное.
Re[6]: try ... catch плодит говнокод
От: T4r4sB Россия  
Дата: 14.02.20 20:37
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>А автор что написал? См. выделеное.


То есть от крестов — шаг назад?
Re[7]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 22:14
Оценка:
Здравствуйте, T4r4sB, Вы писали:

F>>А автор что написал? См. выделеное.

TB>То есть от крестов — шаг назад?
В прямом трактовании — да. RAII не завезли, как и во все подобные управляемые языки (JS например). Только, это именно о языке.
На потребительские качества это фактически не влияет, и на мой взгляд — наоборот упрощает его использование, потому что никаких лишних сущностей не появляется в принципе. Т.е. прикладные задачи — решаются эффективно, а это основной показатель.
Более того, большинство открытых C++ проектов — содержат столько всякой человеческой ахинеи,что диву даешься.
Слабое звено сейчас, далеко на языковые средства, а человек.
Re[6]: try ... catch плодит говнокод
От: Mystic Artifact  
Дата: 14.02.20 22:24
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>А автор что написал? См. выделеное.

Приятно видеть, что кто-то мою ахинею читает. Я фразу 3 раза переписал, что б была понятна. Надо было четвертый.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.