Az alap Java-ból hiányoznak azok az elemek, amikkel könnyen compose-álhatunk dolgokat, a go-t nem ismerem nagyon mélyen, így Scala-val mutatom az utolsó példát, hogyan lesz egyszerű és compose-ált a hibakezelés:
db.beginTransaction
Try(db.insert(foo)) flatmap
Try(mail.send(bar)) map
db.commmit recover
db.rollback
Ha egy kicsit meg akarnánk bonyolítani a helyzetünket, akkor tegyük fel, hogy, ha nem sikerül az adatbázis beszúrás, akkor egy másik beszúrással próbálkozunk, illetve, ha nem megy el az email, akkor egy másik email küldéssel próbálkozunk. Ezt try-catch-el már kicsit bonyolultabban lehet csak megoldani.
db.beginTransaction
Try(db.insert(foo)) orElse Try(db.insert(foo2)) flatmap
Try(mail.send(bar)) orElse Try(mail.send(bar2)) map
db.commmit recover
db.rollback
"Idézet: könnyű refaktorálni. Mennyivel könnyebb, mint a check exception-nél?"
Annyival, hogy itt egy fajta hiba van (Error a Go-nál, Throwable a Java, Scala-nál). Ha mindig csak Throwable-t dobsz (ez van a szignatúrában), akkor ott is könnyű, de ugye nem ez az ajánlott megoldás checked exception esetén.