( mraron | 2015. 07. 16., cs – 14:23 )

"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

ErrorManager

néven, aminek van egy

error

típusu mezője és egy metódusa amit

Execute

-nak hívunk. Az

Execute

metódusnak egyetlenegy paramétere van, mégpedig egy olyan függvény ami egy

error

típust ad vissza. Működése: az

Execute

szé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

error

egy 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)