Size: a a a

2019 December 24

@

@mr_tron in Go-go!
слушайте, а как можно организовать в го иерархию ошибок?
что типа питоновского

class CommonError(Exception):
 pass
class ServerError(CommonError):
 pass
class BadDataError(CommonError):
 pass

if isinstance(e, CommonError):
do_something()
источник

ВС

Владимир Столяров in Go-go!
через оборачивание
источник

@

@mr_tron in Go-go!
а оно умеет разворачивать?
источник

ВС

Владимир Столяров in Go-go!
через As и Is да
источник

DP

Daniel Podolsky in Go-go!
@mr_tron
слушайте, а как можно организовать в го иерархию ошибок?
что типа питоновского

class CommonError(Exception):
 pass
class ServerError(CommonError):
 pass
class BadDataError(CommonError):
 pass

if isinstance(e, CommonError):
do_something()
вот отсюда читать: https://t.me/gogolang/371448
источник

DP

Daniel Podolsky in Go-go!
Владимир Столяров
через оборачивание
нет, через конкретные  var
источник

ВС

Владимир Столяров in Go-go!
так в errors описано два подхода: через переменные и fmt.Errorf("...: %w", ...) и через типы (как с os.PathError)
источник

АП

Александр Попов in Go-go!
жалко не константу :)
источник

DP

Daniel Podolsky in Go-go!
жалко
источник

DP

Daniel Podolsky in Go-go!
Владимир Столяров
так в errors описано два подхода: через переменные и fmt.Errorf("...: %w", ...) и через типы (как с os.PathError)
я не знаю способа отличать друг от друга два типа, реализующие error
источник

ВС

Владимир Столяров in Go-go!
внутри As есть такой интересный код
if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {

  return true

 }
источник

ВС

Владимир Столяров in Go-go!
это не поможет ли отличать?
источник

ЕО

Евгений Омельченко in Go-go!
Daniel Podolsky
я не знаю способа отличать друг от друга два типа, реализующие error
Рефлексией же
источник

ЕО

Евгений Омельченко in Go-go!
Только "иерархию" в духе питона-джавы на этом не особо построишь, но с другой стороны оно и не нужно
источник

@

@mr_tron in Go-go!
окей. я прочитал. допустим я создал

package myerrors

var CommonError = fmt.Error("mylibrary error")
var ServerError = fmt.Errorf("server returns something what we don't want %w", CommonError)

и сделал
package mylib

func Ololo() error {
 return fmt.Errorf("ololo %w", myerrors.ServerError)
}

как мне теперь при вызове  err := mylib.Ololo() проверить на то что err содержит в себе CommonError?
источник

ВС

Владимир Столяров in Go-go!
errors.Is(err, CommonError)
источник

@

@mr_tron in Go-go!
о. спасибо
источник

ВС

Владимир Столяров in Go-go!
только, насколько я помню, есть одна засада: для корректной работы fmt.Errorf с оборачиванем формат должен быть такой your message: %w (двоеточие, пробел и %w)
источник

DP

Daniel Podolsky in Go-go!
двоеточие, вроде, не обязательно
источник

DP

Daniel Podolsky in Go-go!
но - да, %w, и он должен быть последний. и это тот самый поярный лис
источник