I use what I would call as *error context*.
Here is the simple definition of the *error context*:
type ErrorContext interface {
ContainsError() bool
SetError(err error)
Error() error
}
Here is how you would use it inside the error-prone function:
func FragileFunction(ctx ErrorContext) {
if ctx.ContainsError() {
return
}
//some processing ...
//if there is an error
ctx.SetError(errors.New("some error"))
return
}
It allows you to do this:
ctx := NewErrorContext()
fridge := GetFridge(ctx)
egg := GetEgg(fridge, ctx)
mixedEgg := MixAndSeason(egg, ctx)
friedEgg := Fry(mixedEgg, ctx)
if ctx.ContainsError() {
fmt.Printf("failed to fry eggs: %s", ctx.Error().Error())
}
Or you can even do this:
ctxA := NewErrorContext()
ctxB := NewErrorContext()
ignored := NewErrorContext()
a := DoSomethingOne(ctxA)
b := DoSomethingTwo(a, ctxA)
c,d := DoSomethingThree(b, ctxB) //different context
if ctxB.ContainsError() {
c = 1
d = 2
}
e := DoSomethingFour(c, d, ctxA)
if ctxA.ContainsError() {
fmt.Println("Failed To do A")
}
DoSomething(e, ignored) //error is ignored
It is up to you how you would implement the error context.
On Tuesday, September 5, 2017 at 1:27:20 AM UTC+7,
[email protected] wrote:
> Hi guys,
>
> at first I though I really like the idea of how Go deals with error
> management and handling, but the more Go code I look at or try to program,
> the more I get scared about checking errors every second line in every
> given block of code.
>
> Take a look at this example here from "Build Web Application with Golang":
>
> // insert
> stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created)
> values(?,?,?)")
> if err != nil {
> // handle error
> }
> res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
> if err != nil {
> // handle error
> }
> id, err := res.LastInsertId()
> if err != nil {
> // handle error
> }
> fmt.Println(id)
> // update
> stmt, err = db.Prepare("update userinfo set username=? where uid=?")
> if err != nil {
> // handle error
> }
> res, err = stmt.Exec("astaxieupdate", id)
> if err != nil {
> // handle error
> }
> affect, err := res.RowsAffected()
> if err != nil {
> // handle error
> }
>
>
> Seriously? And yes, I have read https://blog.golang.org/errors-are-values.
> ..
>
> The best case reduction I found is:
>
> ...
> res, err = stmt.Exec("astaxieupdate", id)
> checkError(err)
> ...
>
> Still, I need this after each line of calling a function which may return
> an error.
>
> I bet this is not pleasant to do in larger code bases and it also takes
> away focus from what is actually happening.
>
> 50-80% of all lines of code in my example deal with error handling?
>
> This is not good. Seriously.
>
> And don't get me wrong, there is a lot of things I really like, love and
> adore about Go, but catching errors needs an improved syntax!
>
> And I am not proposing try...catch here.
>
> How about introducing a new piece of syntax
>
> "watch if .... "
>
> which tells the compiler to watch out for changes in a given SimpleStmt
>
> The same code as above would look like this:
>
> var err Error
>
> watch if err != nil {
> // handle error(s)
> }
>
> // insert
> stmt, err := db.Prepare("INSERT INTO userinfo(username, departname,
> created) values(?,?,?)")
> res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
> id, err := res.LastInsertId()
> fmt.Println(id)
>
> // update
> stmt, err = db.Prepare("update userinfo set username=? where uid=?")
> res, err = stmt.Exec("astaxieupdate", id)
> affect, err := res.RowsAffected()
>
>
> - The "watch if" would be executed after each assignment of any of the
> variables used in SimpleStmt of the statement.
> - Multiple "watch if" would be executed in order or appearance
> - The "watch if" could be used like "defer..." inside functions
> - The "watch if" would work in its full scope of the watched variables
>
> I am not a language expert, so may be there is a saner way of expression
> what I want to achieve.
>
> But bottom line is, there should by an easier to read and write way to
> deal with errors in Go.
>
>
> Martin
>
>
>
>
>
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.