- 1
- 2
- 3
public void read(InputStream is) throws Exception {
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−51
public void read(InputStream is) throws Exception {
...
}
Когда человек совсем не уверен в себе
И вообще, что за манера, кидать одну строчку кода!
Вот именно! А клиенту метода теперь придётся ловить (или прокидывать дальше) этот сраный экцепшен, с которым он ничего путнего сделать не сможет.
http://govnokod.ru/14254
В апаче коммнос даже closeSilently завезли
но ты и сам контракт нарушил: зачем ты клозишь стрим после IOException?
Ткни носом, где. Разве что flush() не позвал перед close(). Но кто ж знал, что close() у FilterOutputStream молча жрёт исключения (хоть и throws IOException)...
Это не ты контракт нарушил, а джависты: нельзя ничего делать со стримом после того что он кинул exception.
Ну и пидары-же
-------
или не пидары?
из close полетит excception?
Сам попробуй
А раз нежрет то и проблемы нет. Ща проверю была-ли она в седьмой
------
Да, в седьмой именно так)
Ну ок, значит стримы научились юзать только к восьмой джаве
Выходит что в 6-7 джаве джависты сами насрали на свой контракт
Смелая армия просто геройская.
Непобедимейшее войско.
В самом жестоком бою.
Припев:
А я обосрался в строю!
Все коммунисты и все комсомольцы.
Нужно подохнуть вперед добровольцы.
С песнями рота идет.
Только вот я не пою.
Припев:
Я обосрался в строю!
Родина мама спи не ворочайся.
Сыны твои гордо на стреме стоят.
Дали мне тоже большой автомат.
Стой говорят я стою.
Но вот обосрался в строю
и убивать
убивать
Вообще говоря, чекед-эксепшены -- принципиально унылое говно и попоболь. Их невозможно готовить правильно, нету языковых средств.
Вот хочешь ты, к примеру, написать функцию высшего порядка, в которую коллбэк передается. Какое исключение должна кидать эта функция высшего порядка? Это зависит от того, что кидает коллбэк. Как в языке выразить мысль, что метод кидает то же самое исключение, что кидает его функция-параметр? Никак.
Разве джависты пишут функции высшего порядка, спросите вы? Конечно пишут, только не знают об этом. Особенно, теперь, когда им лямбды с потоками подарили.
Помню как-то визитор по простенькому "AST" запилил. Какое исключение нужно бросать из visit у объекта? А хрен его знает. Зависит от того, что бросает визитор.
Захотел сконвертить дерево в JSON или распечатать в поток -- пиши унылые обёртки, которые конвертируют IOException во какой-нибудь специальный RuntimeExeption, и обёртку, которая достаёт родное исключение обратно.
Лютое количество бойлерплейта для простой, казалось бы, задачи.
1) выйти из метода
2) вернуть null или передать ссылку на результат (ах да, в жабе так нельзя), но это не заставит тебя проверить результат и можно легко проебать ошибку, да и писать 10 ретурнов не всегда комильфо.
Если в рантайме у тебя отвалился диск или удаленный сокет или от пользователя пришел мусор, то эксепшен будет ебать мозг пока его либо его ЯВНО не поймают, либо он угандошит весь тред (ну или весь реквест в случае серверов), и это очень круто, просто у этого есть одно узкое применение.
Джависты пишут функции (особенно с тех пор как туда завезли лямбды), но вот именно там чекдэксепшены красиво не заюзать, увы. Это проёб.
Рантайм эксепшены вообще нужны для совсем другого, они просто случайно "так же называются" и сигнализируют о нарушении контракта. Их не надо ловить (разве что если они летят из плагина) а надо пиздить программиста по голове. В идеале они вообще не должны быть Exception, а должны быть Error
Проблем от них гораздо больше, чем пользы, вот в чём поинт. Нормальные пацаны не выпендриваются, не плодят лишные сущности и энкодят ожидаемые ошибки в типе возвращаемого значения.
Тогда нужно на выбор
1) везде вертать туплу (Pair<Result, Error>)
2) в классе Object сделать поле lastError (щтоб он автоматом везде был)
3) научиться принимать указатель на объект чтобы заполнять его ошибкой.
Третий пункт очень любят яблочники в Objc:
Какой из этих вариантов тебе менее противен? Ну или предложи свой
StatusOr<T>
Or_error в Ocaml, MonadError в Haskell.
Подход Go тоже вполне сносен.
Я подумаю еще до чего доебаться)
Александреску про него как-то рассказывал
Ох, сколько же времени прошло прежде чем люди поняли как правильно хендлить ошибки, да?
Тернист путь от errno/GetLastError
Ну в Го вообще ничего хорошего нет, кроме горутин. Но ошибки там - это вообще эпический пиздец. Это так плохо, что даже Вижуал Басик покажется нормальным языком.
С другой стороны, на Го пишут либо дети которые хотят (хотели) прославится на Гитхабе, либо люди, которые повелись на красивую рекламу, и теперь не знают, как от этого говна избавиться. Все без исключения библиотеки на Го такого хуёвого качества, что даже Нода и ПХП на их фоне выглядят надежными и провереными временем.
Посмотреть на код того же Докера, etcd, Тераформ. О, Тераформ, это отдельный пиздец, который даже в горячечном бреду невозможно представить. Так можно в кровавых слезах утонуть. И не в последнюю очередь изза "работы с ошибками".
Начнем с того, что, если по-честному, в Го нет ошибок, как концепции. Есть какая-то хуйня под названием error, которя никого ни к чему не обязывает. И есть убогий механизм для работы с крешами програмы, который даже до уровня trap в Баше не дотягивает. И это, блять, при активно использующейся многопоточности и отсутствующем отладчике.
Изза того, что механизма бросания ошибок нет, нет и стектрейсов, и каждая библиотека дрочит как хочет, но в 90% случаев стектрейсов просто не будет. А в остальных 10% они будут указывать в произвольные места в програме.
Изза отстутсвия каких либо средств для работы с языком, однострочники в Го разрастаются в полотна бессвязных if err != nil { return err }. Статистика по моему проекту:
А вот билт-ин говно:
Из нашего отдела люди готовы уходить с понижением зарплаты туда, где пишут на Питоне, лишь бы только это говно не видеть.
>>Из нашего отдела люди готовы уходить с понижением зарплаты туда,
Когда я работал программистом в маленькой психиатрической больнице (С)
Вообще говоря, нет, не факториал. Веб-приложение -- аналог https://kapeli.com/dash, которое индексирует локальные доки (либу для парсинга я писал на сишке, в го использовал FFI) и позволяет делать fuzzy-поиск (на биграммах) по документации с динамической подгрузкой результатов. Честно говоря, я в основном упирался в тормознутость стандартных структур данных из-за отсутствия нормальных шаблонов. Ручной инлайнинг ускорил тогда мой поиск в 8 раз.
В последнее время я мало пишу на Го (в основном на C++), но воспоминания в основном положительные. В плане обработки ошибок подход у нас аналогичный.
> нет и стектрейсов
Это большая проблема, очень серьёзная. В C++ тоже стектрейсов нет из коробки. Можно сбоку прикрутить при большом желании, но большинство этим не занимается.
Когда пишешь асинхронный код, стектрейсы вообще бесполезны -- коллбэки дёргаются из реактора, интересного в них ничего не увидишь.
> где пишут на Питоне
О да, больше всего на свете я "люблю" программы на питоне, которые в любой непонятной ситуации кидают в меня Key/Value/WhateverError. Возможно, стектрейс поможет разработчику ткнуть пользователя в нужную строчку документации или понять, где он накосячил в типах, но никак не поможет ему побороть свою неспособность нормально обрабатывать ошибки. Пользователю они скорее мешают.
Универсальное средство обработки ошибок -- это миф, исключения им не являются.
А плохие программы (в случае мусора на входе) дают говно.
Нативная программа дает General Protection Fault.
Программа на питоне дает KeyError.
Жаба дает NPE и 150 строк маловразумительных трейсов
Итд
Охотно верю. Жаль, что мне такие практически не попадались.
Да ты их даже в пыхе не увидишь, если сервер правильно настроен... Кто в 2016 году ошибки в браузер срёт?
Яндекс.Музыка
отак с ходу
https://toster.ru/q/61278
Это задача того же уровня, что и построение полного (совсем полного) списка уязвимостей системы.
Я уже говорил, что не против исключений в случае ошибок программиста (в go для этого есть panic).
Правда, в C++ для этого полезней крэшится -- можно потом в core-дампе как следует поковыряться, ибо стэк-трейс зачастую не содержит информации, которая поможет исправить ошибку.
"программа содержит ошибку и будет закрыта, напишите программисту"
Go сам по себе программистов не исправит. Тот, чья стратегия обработки ошибок заключалась в ловле всего что можно в main и печати в stdout, так и будет писать при любом удобном случае if err != nil { return err } и ругать Go. Иногда return err -- это именно то, что нужно. Часто имеет смысл вернуть новую ошибку, с описанием того, что пытались сделать, с какими аргументами, и почему не получилось. "Exception translation", только с менее громоздким синтаксисом и более полезными для пользователя сообщениями.
А про асинхронный код: да, насмешил. Бесполезные говоришь. А что ошибки никогда искать и исправлять не приходилось? Просто потому, что в Го этого практически нереально добиться, не переписав рантайм с нуля - тебе просто в голову не прийдет, что это вообще возможно. А оно ведь все тут, рядом, и существует уже много лет.
А ты не подумал, что над разработкой програмы, и над чтением ее стектрейсов вызваных некорректным поведением програмист проводит 99% от рабочего времени? И что без этой информации, програма вообще никогда не попадет к твоему чисто теоретическому заказчику?
В соседнем отделе, продукт, аналогичный нашему писало два человека на Питоне. (В моем отделении нас было шестеро, но двое уволились, и еще двое перешли в другие отделы). Они все сдали и уехали в Аргентину на месяц курить гашиш, а у нас что ни неделя, то добалвяется 100-200 if err != nil. Потому, что билт-ин библиотека - говно. Чужие библиотеки - говно. В своем коде невозможно проследить логику выполнения изза того, что приходится бороться с некорректной работой всего остального.
Я молюсь чтобы меня перевели либо на Питон, либо на Руби. Я бы даже на Яве писал, лишь бы это говно больше никогда не видеть.
--Докажи
--Ну у нас на Language1 программу написали быстрее, чем на Language2.
У Сёмы достойный конкурент
>--Ну у нас на Language1 программу написали быстрее, чем на Language2.
Значит она им дешевле вышла, понимаешь? ДЕНЕШКИ. В мире апинсорса такого нет.
--ахахаха openssl не используют в серьезных конторах
--докажи
--ну я слышал что в amazon его не используют
--хахаха l2tp не настроить в линуксе
--докажи
--ну я чатился с долбоебом который не осилил l2tp в freebsd
Вы с wvwvwcwv два сапога пара
>--докажи
>--ну я чатился с долбоебом который не осилил l2tp в freebsd
Сама додумала, обезьянка? Где я это утверждал?
>--ахахаха openssl не используют в серьезных конторах
>--докажи
Хром. Существование форков.
http://govnokod.ru/21736#comment360570
>>Хром. Существование форков.
Cryptography Functions из Windows не используются в Chrome под Mac OS X. Следовательно, Windows Crypto API не используется в серьезных проектах.
Бугага.
>http://govnokod.ru/21736#comment360570
Где ты там прощел "l2tp не настроить в линуксе" и "l2tp в freebsd"? Конкретно эти цитаты приведи, питушок косоглазый.
В том числе он не мог в L2TP. Когда я попыталася рассказать тебе о прелестях L2TP на винде, ты начал нести нелепые отмазки про какого-то неосилятора, который не смог L2TP во фрибзд.
Тут дело даже не в том, что FreeBSD не имеет отношения к линуксу (незнание этого факта я тебе прощаю, ты и более простые вещи не знаешь), а в том что для доказательства утверждения "Foo это сложно" ты приводишь аргумент "питушок не смог Foo".
Это характеризует только петушка. Ну и тебя, как человека который с ним общается.
Мне даже лениво объяснять насколько не в тему тут это твое глупое замечание.
Ясно.
Наверное нужно последние 15 лет прожить в пузыре, чтобы всерьез думать что в линуксах драйверы компилируют вручную, а опенсурсные разработчики не получают зарплату.
Люди в RedHat, Apple и Google, разработчики Android, Darwin, llvm -- им всем ужасно приятно будет узнать что они не получают зарплату.
> значит она им дешевле вышла
Ахуенная логика.
В выводе, достойном британских учёных - "если программу написали быстрее, то она им дешевле вышла".
И что программисты в мире опенсурса тоже получают зарплату.
А потом ты научишься читать, почитаешь первоначальный высер своего брата по разуму, и узнаешь что деньги и скорость написания тут вообще не причем
И что зарплата у разных программистов, внезапно, разная... И что сложность программ могла отличаться...
> она тоже не бесплатна
Скупой платит джважды ;)
Как на это влияет ЯП? Я имел в виду написать ту же программу с тем же качеством. Если ее можно написать быстрее, то почему нет?
Т.е. премий и повышений у вас там не бывает? :) Грустно как-то...
Go виноват?
но я бы не сказал, что сейчас на рынке труда всё плохо
Ну поищи контору которая тебе нравится, узнай что ей надо и выучи.
А то вот так люди страдают до тридцати пяти лет, а потом оказывается что лет им уже много, а кроме просиженных штанов опыта и нет.
Можно сказать 42 или 29.
По количеству фич? По количеству программистов? По количеству проектов? По математической каноничности? По строчкам кода для решения эталонной задачи? По количеству правил грамматики?
Тут хотя бы человек публикует данные, каким-то образом относящиеся к реальности.
да
>>По количеству программистов?
нет
>>По количеству проектов?
да
>>По математической каноничности?
не очень
>> По строчкам кода для решения эталонной задачи?
да
>> По количеству правил грамматики?
не очень
>>каким-то образом относящиеся к реальности.
Один мой знакомый ходил в синей кепке, и его сбила машина.
А другой ходил в красной и его не сбила.
Отсюда я делаю вывод что синие кепки носить опаснее.
Собственно, это основная часть моей работы -- чинить нетривиальные ошибки. Когда люди нормально обрабатывают ошибки, ты либо сразу понимаешь, в чём проблема (даже не открывая сорцов), либо вставляешь кусок текста ошибки в git grep/code search и практически сразу находишь нужное место.
Кстати, ты может раньше не замачал... Твои доводы на 96% состоят из эмоций и не содержат информации для размышления.
Багинтродьюсеры делают баги, а багфиксеры их правят.
так и живут.
Видимо ты пытаешься перенести свое доширачерство на галерах на гугл.
Этакий обратный карго-культ.
Я каждое утро прихожу на работу, открываю логи сервиса, и создаю баги на все крэши и ERROR записи, которые считаю ошибкой. Часть назначаю на ответственных, часть чиню сам.
Мне вообще стрёмно писать новый код, пока старый делает хрен пойми что.
Ты так не делаешь, @subaru?
Прям начало копипасты о Воване.
По поводу метрик, и почему раньше сделаный продукт в соседнем отделе - это показательно.
Потому, что, как я уже говорил, продукт аналогичный. Наш отдел пишет инфраструктуру для тестов, другой отдел пишет инфраструктуру для самой системы. Под инфраструктурой понимается установка, настройка, отладка, аггрегация статистики и первичный анализ.
Наши задачи очень похожи, и по объему и по назначению.
Код написаный на Питоне вызывает минимум проблем: за последние три месяца в ночных сборках + тестах этот код проявил себя всего два раза (один раз забыли добавить какую-то программу в системный путь, и другой раз поменялся механизм раздачи SSH ключей в кластере, который они не предусмотрели).
Код написаный на Го вызывает проблемы раз в два-три дня. С банальными ошибками, которые прошли мимо код-ревью потому, что на Го можно писать только говнопортянки, и просто нету достаточно человек, чтобы уделить достаточно внимания чтению этого бреда. Ошибки типа: после парсинга Ясона забыли проверить длину массива. Перепутали местами строчку с сообщением об ошибке и строчку, где предполагается, что ошибка уже обработана. Ну, и иногда билт-ин АПИ подсыпает всяких крашей в абсолютно безобидных местах. Типа "попытка закрыть уже закрытый канал, блять" - очень серьезная ошибка изза которой програма закрывается без строчки логов.
Нет, я же написал, что понимаю под нормальной обработкой ошибок -- внятное семантическое описание проблемы, понятное пользователю, вместо унылых стектресов. Например, довелось мне как-то запускать чей-то питонокод, обучающий классификатор. Через пару минут работы обучателя вываливался невнятный стэктрейс из глубин skikit-learn с сообщением ValueError: 1 < 2. Оказалось, что обучающий набор был кривой и содержал только примеры с одной меткой. Нормальной обработкой ошибок я бы назвал сообщение "Your training set contains only 1 label, the classifier expects at least 2. Check your data." Это сообщение бы мгновенно указало мне на мою проблему, и мне не пришлось бы пару часов изучать кишки skikit, чтобы понять, как я пришёл к 1 < 2.
> это показательно.
Это было бы показательно, если одни и те же люди, имеющие одинаковую экспертизу в обоих языках, писали одно и тоже. Откуда мне знать, какие вы там профессианалы, если вы каналы по два раза закрываете.
> парсинга Ясона забыли проверить длину массива
В питоне такую ошибку, несомненно, невозможно допустить.
> Перепутали местами строчку с сообщением об ошибке и строчку, где предполагается, что ошибка уже обработана.
Исключения, очевидно, решают эту проблему.
> безобидных местах. Типа "попытка закрыть уже закрытый канал
Это в основном показывает, что вы не умеете в понятие "владение ресурсом". И да, это означает ошибку программиста.
> програма закрывается без строчки логов.
Чего? Паника происходит. Если вы не печатаете её в лог -- это ваша проблема.
panic: close of closed channel
Тебе о профессионализме не судить, если ты думаешь, что это очень нужный краш при повторном закрытии канала. Краш всей программы, Карл! Нахуй нужен такой close() в высокоуровневном языке с потоками и селектами? Просто у этих долбоебов "так получилось", вот поэтому так и работает. Они не планировали, не думали о том, как лучше сделать. Налабали какой-то хуйни и в продакшн. Благо, все, что они делают - для внутреннего пользования, а там видимо инженерам нечем руки занять, вот и тестируют. Вот и пишут ёба-недоинерпретаторы Питона на Яве для сборок своих проектов и подобную хуету.
Я же говорю, что в Го эти тривиальные ошибки тяжело найти изза того, что код размазан на 100500 строк бессмысленной повторяющейся хуйни. Ревьюер не в состоянии читать одно и то же, и не ошибаться никогда.
Да чего там дальше объяснять... Ну, вот, продукт "известной" компании. Типа хай-энд продукт. Семинары, платные специалисты, все дела: Твои же братья-долбоебы написали. У меня просто руки опускаются, когда мне говорят, что мне нужно это говно использовать в своем проекте. Они, блять, ошибки все одного типа возвращают, принтэфами. Без стак трейсво. Полотно из функций на 200 строк. Пидарасы. Уебаны. Слов нет.
Мне бы твои проблемы. У меня тут функции по 2к строк очень плохого спагетти. Хнык :'(
Попробуй PHP, серьезно. Там можно и файлы 2 раза закрывать, и к неинициализированным переменным обращаться.
Главное собачку поставить в начале.
Вообще управление ресурсами и памятью это скучно. Лучше всегда рандомно выделять память и освобождать её, захватывать ресурсы и отпускать. Пусть ЯП и его рантайм сам обо всем позаботятся
Ну ок, давай посмотрим глазами трезвого человека на то, что ты написал.
В соседнем отделе люди пишут на питоне, и не ноют, и вообще всё давно сделали. У вас много детских ошибок: потерянные проверки, перепутанные местами педали строки, не знаете, кто владеет каналами, не печатаете паники в лог. Вы ноете и хотите уволиться. И виноват в этом, разумеется, Go. Потому что там писать много надо.
Нет, ну всякое бывает, я тоже раз в год continue в каком-нибудь цикле забываю в чейнджлисте на 100 строк, и ревьюер этого не замечает, но язык-то тут причём.
> повторном закрытии канала
Повторное закрытие канала в "в высокоуровневном языке с потоками и селектами" это потенциальный рейс кондишен. Вероятно, две горутины конкурентно гадят в один канал, и не знают, кто его должен закрыть. Лучше просигналить эту ошибку сразу, чем ждать, пока через полгода что-нибудь закрэшится при попытке записи в закрытый канал.
Если ты так не считаешь, то вам следовало писать на PHP: там можно делить на нуль и игнорить ворнинги.
> ошибки все одного типа возвращают
И чем тебе помогут ошибки разных типов в этом случае? Ты напишешь код, который сам будет устанавливать отсутствующий сертификат, если получит MissingCertificateError? Видимо, тут все ошибки unrecoverable, код не сможет починить сам себя, требуется внимания программиста. На первый взгляд ничего откровенно плохого не вижу. В пистоне была бы такая же портянка, только отовсюду летел бы какой-нибудь KubernetesError или, ещё хуже, ValueError.
> ревьюер не в состоянии читать одно и то же
Ну х.з. У нас вот тоже код с ручной обработкой ошибок (+RAII для всех ресурсов). Если кто-то где-то забывает обработать ошибку - на ревью это прям режет глаза, т.к. выбивается из общего стиля и нарушает однородность ;)
сивоконь конечно редкостный апиздабол
> Чужие библиотеки - говно
A bad workman blames his tools.
Как ты справляешься с такими ситуациями, борманд?
> стектрейс
У тебя есть стектрейс и дампы. Мне бы твои проблемы...
> Как ты справляешься
Культурой кода - проверки указателей, ассёрты, RAII и т.п. Больше, походу, никак.
З.Ы. Хотя, после проезда по памяти, все эти коры и бектрейсы - просто бесполезный мусор, показывающий на какой-нибудь невинный код...
Ты под ios пишешь чтоли? Это когда твоя программа упала у Васи и всё что ты знаешь это "твоя программа упала"?
Ну это не очень полезный совет. "Чтобы программа не падала, надо просто не писать баги."
Ну раз не хочешь ему следовать - пиши хуйню @ читай крешдампы до утра. Пока не обретёшь просветление.
Use Erlang @ Let it crash
Я вас умоляю. У нас две недели даётся на изучение с нуля вместе со всем ФП. Потом, конечно, некоторое время на гк наблюдаются "фирменные ревью от Снаута".
У меня на прошлой работе гуйня для терминала так работала - сегфолтилась, супервизор её перезапускал, прога подтягивала стейт с сервака, обрабатывала кнопочки-датчики, отправляла стейт на сервак, рисовала новый фрейм, сегфолтилась... Сегфолт каждый кадр, но по ощущениям вполне нормально работало, просто трафика много на сервер. Заметил не сразу :)
Тогда вообще бы не заметил?
З.Ы. Супервизором там был тупой sh скрипт с бесконечным циклом :)
Наоборот, через некоторое время супервизор отправил бы чайлда мыться под струю сам бы покрешился, ибо поддерживать сервис -- это хорошо, но поддерживать _неправильно_ работающий сервис -- немного другое.
> Супервизором там был тупой sh скрипт с бесконечным циклом :)
Это тогда не надзиратель, а сообщник.
Т.е. в итоге самый главный супервизор понимает, что жизнь - тлен. И делает харакири себе и всем оставшимся в живых?
Именно. Если не помогает даже, скажем, рестарт на уровне кластера, главный супервизор говорит, мол, "вызывайте этих говнокодеров из отпусков, выходных и заказывайте им ведро вазелина, а я отправляю трафик в другой дц и ухожу в спячку".
По-поводу чужих библиотек. Ну, взять тот же парсер для Ямла на Го. Это уебищная копи-паста из сишного кода, без понимания того, что происходит в оригинале. Он примеры с оф. сайта в половине случаев не может распарсить. А когда может - выбрасывает нужную информацию. Ну и кроме всего прочего - не потокобезопасный.
Есть, например генерилки для Трифта / Сваггера. Код сгенерированый для Трифта ни один линтер не пройдет, а кроме того, в сгенерированом коде не просто невозможна многопоточность, он вообще больше одного запроса одновременно обработать не может. В Сваггере сгенерированом полно string.ToUpper("POST") и т.п. хуйни. Они наверное вообще ни разу не смотрели на то, что генерировали. А до запуска дело вообще не дошло.
Из гугловского говна: реализация SFTP, но без сжатия. Зато они туда нахуярили асинхронную сборку и чтение файлов. Типа, можно читать файл одновременно с разных отступов. Но интерфейс у этого говна все-равно последовательный. Т.е. если попытаться патч написать для этого бесполезного говна, на это уйдет несколько месяцев.
А вообще, на говнокоде просто места не хватит рассказывать про всю уебищность библиотек на Го. Выше - только промиля из всего, что там творится.
У гошников явный тренд писать все снуля на го. У них даже собственная реализация tls на го вместо опенссл.
никому не рассказывай что у жабы и дотнета тоже есть такой тренд.
ого, вот это реально стращно
Всего года на 3, если верить вики :)
А насчёт того, что фреймворк лучше - только последние. Второй тем ещё говном был. А первый - имхо, даже хуже жабы.
И уж конечно он в тысячу раз лучше пхп
Зачем они нужны?
В корпорации добра такие NDA что папа не горюй
Я вот слыхал что там до такой степени своя атмосфера, что даже кодстайлы у них не всегда совпадают с оф. рекомендациями (типа питонячьего pep8)
Не совсем понятно, что ты ожидаешь услышать. Всё, что я могу рассказать, уже давно и так опубликовано и широко известно (собственно, поэтому я и могу это рассказать).
> Как без стл живется?
Кто сказал, что без стл? Либы тут отличные, кстати.
> Как процесс разработки устроен?
Ну я в общем не настаиваю. Если нет охуительных историй, то и не надо.
>> master, XP coach…) it was possible to carefully
>> introduce agile practices into Google
Круто:) Я единожды видел скрам в аутсорсе. Продуктовые компании редко его умеют. Гугл молодец
--добавили в беклог, попробуем впихнуть в следующий спринт на планировании
Пленниг покер: сколько времени займет замена мыши?
> с исключениями в уме
Лол, в каком месте? Весь STL exception-agnostic, iostreams вообще унылое говно на флажках.
Все контейнеры stl, которые никак не могут просигналить об out of memory. Разве что тупо abort()'ом.
А на линупсе оно вообще редко прилетает... Скорее OOM киллер кого-то убьёт в подворотне, чем ядро признается в недостатке памяти.
std::set_new_handler
Вызов Borg, который перезапустит бинарник на машине с большим кол-вом RAM.
Какова вероятность, что некая строка является валидным числом? Небольшая. Значит, ошибка в этой функции вполне ожидаема. Если ошибка ожидаема, какое-же это тогда "исключение"?
Разумеется, для этого есть вменяемые эквиваленты, возвращающие StatusOr<T>.
Ну ок, ты нашёл пару функций в стандартной библиотеке, которые зачем-то кидают исключения.
Я всё же утверждаю, что большая часть кода там exception-agnostic (контейнеры, алгоритмы, стримы, сишные легаси, етц). А то, что не агностик -- не нужно.
От bad_alloc никуда не денешься, но там можно просто крэшится, большинство приложений не могут обработать эту ошибку.
А я утверждаю, что такой хуйни там навалом. А еще есть буст.
Ок, продолжай утверждать.
А я и дальше буду юзать умные указатели, *map, vector, string, подмножество буста, етц.
Нам оно без надобности, у нас тут свои эпичные конфиги.
> string
http://en.cppreference.com/w/cpp/string/basic_string/at
http://en.cppreference.com/w/cpp/string/basic_string/insert
http://en.cppreference.com/w/cpp/string/basic_string/erase
http://en.cppreference.com/w/cpp/string/basic_string/append
en.cppreference.com/w/cpp/string/basic_string/replace
http://en.cppreference.com/w/cpp/string/basic_string/substr
http://en.cppreference.com/w/cpp/string/basic_string/copy
так ты хвалишься или жалуешься?
Касательно моей оценки ситуации:
- Исключения - говно. Я бы хотел, чтобы в плюсах их не было.
- Гугл - заебись. Это плохо, что я не работаю там CTO.
Все перечисленные методы кидают правильные исключения (в отличие от stol). Причина выбрасывания этих исключений -- халатность программиста. Перечисленные методы можно спокойно вызывать в любом гугловом коде, просто ошибка в коде приведёт к std::abort().
> По этой же причине я не буду следовать этому стайлгайду.
Можно подумать, тебя кто-то заставляет.
Исключений в том смысле, в каком они используются в Objc например, или в смысле "RuntimeException / AssertError" в жабе?
Ну например сказано "не передавать сюда NULL", а его передали и получили исключение?
Нет, не против. Суть в том, чтобы отличать ожидаемые ошибки от исключительных ситуаций.
Проблемы с I/O при записи в файл -- ожидаемая ошибка, которую можно и нужно предусмотреть заранее и обработать.
Выход за границе массива -- это ошибка в программе, которую нельзя предусмотреть и правильно обработать.
OutOfMemory означает, что программист неправильно оценил ресурсы, которые требуются для корректной работы программы, с этим в большинстве случаев ничего не сделаешь.
И да, я не считаю, что at() у мапы должен кидать исключение или крашить программу. Из-за такого at'а я использую find и ебу итераторы (хорошо хоть auto завезли).
а можно подробнее?
Сдыхает он срязу там, или наверху колстека?
Деструкторы же
да, я о них, финалайзеры это вообще атавизм он тут не при делах
Используй вместо него operator[], нет?
тогда зачем городить иерархию таких исключений?
И зачем механизм их отлова?
-------------
Воепрос тебе на засыпку: Для тупого веблога является ли недоступность СУБД ожидаемой или это исключительное?
Недоступность любого внешнего процесса является ожидаемой. Проектировщики апи клиента СУБД не знают, где он будет использоваться -- в веблоге или нет.
Автор серьезного софта его ловит и обрабатывает.
Автор веблога ловит ВСЕ exceptions, пишет пользователю "temporary down", текст эксепшена (toString()) пишет в лог, и шлет письмо админу.
Админ видит текст эксепшена и все фиксит.
Все. Одинаково хендлятся ВСЕ эксепшены, буде-то место кончилось на БД или коннекшен упал.
В твоем же случае StatusOr<T> придется тащить буквально везде, до самого верху чтобы записать его в лог и сделать тоже самое.
А если метод одновременно подключается к СУБД и REST API удаленного сервиса?
Там будет уже две ошибки.
Представь как засрется API, нет?
Очевидно, автор этого веблога пишет на PHP и вообще живёт счастливо без всяких исключений, connect() or die(), вот это всё.
Посмотрим, как админу понравится получать письмо каждый раз, когда KeyError какой-нибудь случится.
KeyError это одноразовая ошибка, а no space left on device явно волнует админа, разве нет?
Ремоутинг, значит.
Ты правда будешь пихать в КАЖДЫЙ (даже войд, лол!) метод status?
А с другой стороны проблема напоминает nullify.
В современных ЯП принято иметь для Nullable и notnull разные типы, и заставлять юзера явно проверять что значение не null.
Kotlin e.g.
Тут почти тоже самое
А в чём, собственно, проблема? Идея относится к удалённому сервису так, будто он ничем не отличается от локального -- уже плохая. Даже жабисты это поняли на заре RMI, поэтому чекед RemoteException кидается из каждого прокси.
Другой пример это прокси-классы на SOAP.
>>Не отличается от локального -- уже плохая
Во ты сейчас просто взял, и насрал на целый пласт архитектуры, понимаешь?
А если у меня есть алогритм который должен быть агностик на тему того локальный он или удаленный?
Конечно, удаленный будет работать в 38 раз медленее, но и пофиг. Это ентерпрайз, он асинхронно обрабатывает заказ, и мне не важно что он занимает не 15 секунд а 15 минут.
Почему я должен его менять?
Ну вот и пусть всегда считает, что он удалённый, даже если исполняется локально ;)
Кашицын всей моей жизни
Иду по вечному кругу
Ебут тебя во все дыры, да? )
Вот это кстати хуйня полная. Это же элементарно было бы сделать. Так почему не сделали?
Пусть функция, чей формальный параметр есть другая функция с эксепшеном E явно говорит (ну или при вызове ее явно указывается): "я прокину E" либо "я обязуюсь поймать и обработать E".
А знаешь почему эта, казалось бы элементарная, мысль не пришла никому в голову?
Потому что никто не умеет checked exceptions, даже в Oracle:) Все думают что это "говно какое-то и всё равно его никто не юзаеот"