I find Go’s error handling refreshingly simple & clear. Nowadays, all I do is wrap my errors using fmt.Errorf with some additional context. The pattern I tend to use most of the time just includes a function/method name, like so: funcsomeFunction() error { err:=someStruct{}.someMethod() returnfmt.Errorf("someFunction: %w", err) } typesomeStructstruct { } func (sssomeStruct) someMethod() error { returnfmt.Errorf("someMethod: %w", errors.New("boom")) } If I now call someFunction, the error - ...