LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Обработать смогу. Узнать откуда пришла - видимо тоже смогу, раз gin стек печатает при панике. Строчки сравнивать не обязательно. Как паникуемое значение, так и error - это interface{}, отличие только в одном методе. Принимай любое соглашение в рамках своего проекта и получай структурированную инфу. Используй switch, когда известна только часть инфы.

Я вот делаю уже третий учебный проект и, соответственно, пробую третий подход к тому, как структурировать инфу в ошибках. У меня есть два тестовых задания и один свой проект. В своём проекте я внутри себя почти всё делаю через панику, если код вызывается из обработчика http запроса. В первом тестовом задании я делал через errors.Wrapf, но это мало что даёт - ты получаешь просто список строк по сути. А теперь придумал свой тип errorWithCode{Code: <enum>, Message: string} для своих сообщений. Но пока всё это ещё не особо совершенно, и паника всё равно удобнее.

При обработке паникой я завёл свой тип. В gin я подменяю обработчик паники (или свой внутри пишу, не помню уже) и, если паника мне известна (имеет мой тип), то обрабатываю её. Если неизвестна - то log.Fatal, а дальше уже дело systemd перезапустить сервис. В продакшене это не использовал и не знаю, хорошо ли это работало бы, но перехватывать любую панику и делать вид, что приложение не сломалось - это просто глупость и авантюризм - от такого потом самолёты падают и АЭС взрываются. Т.е. то, что делает gin по умолчанию - это просто отстой.

Далее, если заменяем err на panic, то разница между error и interface{} совершенно минимальна, потому что printf %#v превращает в строку что угодно. В целом решение сделать error настолько простым представляется мне одним из самых неудачных решений в языке, которое превращает программы в помойку. Нужно было сделать хотя бы error и числовой код, как это сделано в SQL. Или, ещё лучше, error, строка - глобальное имя модуля вместе со всеми этими github.com, и число, назначаемое разработчиком модуля.

Сейчас я делаю тестовые задания, но приходится следовать принятой культуре и поэтому приходится не пользоваться паникой, отчего размер кода увеличивается раза в полтора-два без всякого профита.

Исправление den73, :

Обработать смогу. Узнать откуда пришла - видимо тоже смогу, раз gin стек печатает при панике. Строчки сравнивать не обязательно. Как паника, так и error - это interface{}. Принимай любое соглашение в рамках своего проекта и получай структурированную инфу. Используй switch, когда известна только часть инфы.

Я вот делаю уже третий учебный проект и, соответственно, пробую третий подход к тому, как структурировать инфу в ошибках. У меня есть два тестовых задания и один свой проект. В своём проекте я внутри себя почти всё делаю через панику, если код вызывается из обработчика http запроса. В первом тестовом задании я делал через errors.Wrapf, но это мало что даёт - ты получаешь просто список строк по сути. А теперь придумал свой тип errorWithCode{Code: <enum>, Message: string} для своих сообщений. Но пока всё это ещё не особо совершенно, и паника всё равно удобнее.

При обработке паникой я завёл свой тип. В gin я подменяю обработчик паники (или свой внутри пишу, не помню уже) и, если паника мне известна (имеет мой тип), то обрабатываю её. Если неизвестна - то log.Fatal, а дальше уже дело systemd перезапустить сервис. В продакшене это не использовал и не знаю, хорошо ли это работало бы, но перехватывать любую панику и делать вид, что приложение не сломалось - это просто глупость и авантюризм - от такого потом самолёты падают и АЭС взрываются. Т.е. то, что делает gin по умолчанию - это просто отстой.

Далее, если заменяем err на panic, то разница между error и interface{} совершенно минимальна, потому что printf %#v превращает в строку что угодно. В целом решение сделать error настолько простым представляется мне одним из самых неудачных решений в языке, которое превращает программы в помойку. Нужно было сделать хотя бы error и числовой код, как это сделано в SQL. Или, ещё лучше, error, строка - глобальное имя модуля вместе со всеми этими github.com, и число, назначаемое разработчиком модуля.

Сейчас я делаю тестовые задания, но приходится следовать принятой культуре и поэтому приходится не пользоваться паникой, отчего размер кода увеличивается раза в полтора-два без всякого профита.

Исходная версия den73, :

Обработать смогу. Узнать откуда пришла - видимо тоже смогу, раз gin стек печатает при панике. Строчки сравнивать не обязательно. Как паника, так и error - это interface{}. Принимай любое соглашение в рамках своего проекта и получай структурированную инфу. Используй switch, когда известна только часть инфы.

Я вот делаю уже третий учебный проект и, соответственно, пробую третий подход к тому, как структурировать инфу в ошибках. У меня есть два тестовых задания и один свой проект. В своём проекте я внутри себя почти всё делаю через панику, если код вызывается из обработчика http запроса. В первом тестовом задании я делал через errors.Wrapf, но это мало что даёт - ты получаешь просто список строк по сути. А теперь придумал свой тип errorWithCode{Code: <enum>, Message: string} для своих сообщений. Но пока всё это ещё не особо совершенно, и паника всё равно удобнее.

При обработке паникой я завёл свой тип. В gin я подменяю обработчик паники (или свой внутри пишу, не помню уже) и, если паника мне известна (имеет мой тип), то обрабатываю её. Если неизвестна - то log.Fatal, а дальше уже дело systemd перезапустить сервис. В продакшене это не использовал и не знаю, хорошо ли это работало бы, но перехватывать любую панику и делать вид, что приложение не сломалось - это просто глупость и авантюризм - от такого потом самолёты падают и АЭС взрываются. Т.е. то, что делает gin по умолчанию - это просто отстой.

Далее, если заменяем err на panic, то разница между error и interface{} совершенно минимальна, потому что printf %#v превращает в строку что угодно. В целом решение сделать error настолько простым представляется мне одним из самых неудачных решений в языке, которая превращает программы в помойку. Нужно было сделать хотя бы error и числовой код, как это сделано в SQL. Или, ещё лучше, error, строка - глобальное имя модуля вместе со всеми этими github.com, и число, назначаемое разработчиком модуля.

Сейчас я делаю тестовые задания, но приходится следовать принятой культуре и поэтому приходится не пользоваться паникой, отчего размер кода увеличивается раза в полтора-два без всякого профита.