"használjunk wrapper függvényt, ami feljegyzi, hogy volt-e már hiba és ha igen, menjen át noop-ba"
És ez miért nem használható ebben az esetben is? (mail-os db-és példád)
Példa: http://play.golang.org/p/_nagsbM12L
Lényegi kód:
type ErrorManager struct {
Err error
}
func (e *ErrorManager) Execute(f func() error) {
if e.Err != nil {
return
}
e.Err = f()
}
func main() {
em := ErrorManager{nil}
em.Execute(func() error {
return nil
})
em.Execute(func() error {
return MailError{}
})
switch em.Err.(type) {
case MailError:
fmt.Println("Nem tudtam kézbesíteni a spamünket nagyuram :(")
case DBError:
fmt.Println("Nem érem el az adatbázist!")
default:
fmt.Println("Ok")
}
}
A kód magyarázata:
Van egy structunk
ErrorManagernéven, aminek van egy
errortípusu mezője és egy metódusa amit
Execute-nak hívunk. Az
Executemetódusnak egyetlenegy paramétere van, mégpedig egy olyan függvény ami egy
errortípust ad vissza. Működése: az
Executeszépen megnézi, hogy volt-e már hiba, ha volt nem csinál semmit, ha nem akkor lefuttatja a függvényt és feljegyzi az esetleges hibát, a struct megfelelő mezőjébe.
Mivel go-ban az
erroregy interface, ezért type assertation-t hajthatunk végre rajta. Ez alapján betudjuk azonosítani a hiba típusát (a kódban
MailError,
DBError) és ennek megfelelően cselekedhetünk. (https://golang.org/doc/effective_go.html#interface_conversions ; https://golang.org/ref/spec#Type_assertions)