История изменений
Исправление 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, и число, назначаемое разработчиком модуля.
Сейчас я делаю тестовые задания, но приходится следовать принятой культуре и поэтому приходится не пользоваться паникой, отчего размер кода увеличивается раза в полтора-два без всякого профита.