Dorival, thanks for counting your error calls, but without any other number showing the size of your project they cannot really put in perspective ;-)
And I think *watch* should not only be function bound, but bound to the current scope, same as *var*. Martin On Tuesday, September 5, 2017 at 9:20:10 AM UTC+2, Dorival Pedroso wrote: > > And I've written 231 error messages (I use a function called chk.Err() to > do so): > find . -iname "*.go" -exec grep -inH "chk.Err" {} \; | wc -l > 231 > > See the messages here: > https://gist.github.com/cpmech/d2e36dcbe277cd72605f3732d79c798b > > And I have a feeling that I've done only 20% of the error messages... > (lots of work still needed...) > > > On Tuesday, September 5, 2017 at 5:15:16 PM UTC+10, Dorival Pedroso wrote: >> >> I'm working on a Go project right now and I realised I've written 569 "if >> err != nil": >> find . -iname "*.go" -exec grep -inH "if err != nil" {} \; | wc -l >> 569 >> >> >> On Tuesday, September 5, 2017 at 4:57:45 PM UTC+10, Axel Wagner wrote: >>> >>> >>> >>> On Tue, Sep 5, 2017 at 8:49 AM, <marti...@programmfabrik.de> wrote: >>> >>>> Axel, >>>> >>>> thanks for the reply. >>>> >>>> As I already replied to Tomas, I am not looking for improvements in >>>> this particular case where I need to call an SQL database. >>>> >>>> An no, I dont want to wrap all function I use into something which >>>> collects the errors for me. >>>> >>>> Let's say you want to log & panic & exit after any error. >>>> >>>> How do you do that, without putting code after each statement or >>>> wrapping? >>>> >>> >>> You don't. But it's a bad idea. And "I want to make writing bad code >>> easier" isn't a very convincing argument for a language-change. >>> >>> You can't. And that's why I am proposing to be a little bit open to new >>>> ideas. >>>> >>> >>> And how open are you to the idea that good error handling isn't about >>> writing the least amount of code or bubbling up an error in the most >>> efficient way, but about *handling errors*? Because you haven't really >>> replied to that part. >>> >>> (and FTR, one of the points I was making is, that this isn't a new idea. >>> It's proposed fairly frequently) >>> >>> >>>> Every modern language I know of has some sort of try...catch construct. >>>> >>> >>> Go is modern and doesn't have it. So this seems cherry-picked. >>> >>> >>>> >>>> >>>> Martin >>>> >>>> >>>> >>>> >>>> On Monday, September 4, 2017 at 10:57:51 PM UTC+2, Axel Wagner wrote: >>>>> >>>>> See, e.g. here >>>>> <https://groups.google.com/d/topic/golang-nuts/ROr5jveMQvg/discussion> or >>>>> here >>>>> <https://groups.google.com/d/topic/golang-nuts/68J-mLCC1JI/discussion> >>>>> for >>>>> previous discussions of very similar (even mostly identical) proposals. >>>>> >>>>> What I always dislike about these kinds of proposals is, that they are >>>>> encouraging not handling errors, but instead just passing them up-stack. >>>>> In >>>>> general, all of the sites where you are checking for errors will signify >>>>> different error conditions, that should be communicated differently >>>>> upstream. For example: >>>>> >>>>> db.Prepare("INSERT INTO userinfo(username, departname, created) >>>>> values(?,?,?)") >>>>> -> This could fail for basically two reasons: Either communication >>>>> with your database somehow failed (e.g. a broken network connection), in >>>>> which case you want to return the equivalent of an HTTP 503 error, or the >>>>> syntax of your statement is wrong, in which case I'd argue panic'ing >>>>> would >>>>> be the correct thing - at the very least, returning the equivalent of a >>>>> 500. >>>>> >>>>> stmt.Exec("astaxie", "研发部门", "2012-12-09") >>>>> -> Either a 503. Or 400, 403, 409… >>>>> >>>>> res.LastInsertId() >>>>> -> 500 or 501? >>>>> >>>>> The issue is, that by simply checking for nil and passing it along, >>>>> you are *not handling your error*. Different error conditions require >>>>> different error handling and what the correct error handling is, depends >>>>> heavily on the application. An ENODIR error in one line of code can >>>>> signify >>>>> a totally different error condition than the same error two lines later. >>>>> So >>>>> all of these proposals are born out of an exception-style idea of how >>>>> error >>>>> handling is supposed to work; deep within the call stack something goes >>>>> wrong and that something is then just bubbled up to be someone else's >>>>> problem. Good error handling just can't be well abbreviated in this way - >>>>> at least not generically. It's too application-specific for that. >>>>> >>>>> On Mon, Sep 4, 2017 at 8:27 PM, <marti...@programmfabrik.de> wrote: >>>>> >>>>>> 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. >>>>>> >>>>> >>>>> A better take-away from that blog post would have been, to orient >>>>> yourself around the example of a writer given. You could, for example, >>>>> provide a one-time abstraction that wraps *sql.DB and collects the error. >>>>> I'd agree that the sql package tends to not be amazing for that, because >>>>> of >>>>> its set of interdependent types, it is still possible. For example, with >>>>> this <https://play.golang.org/p/kdgBUqWeR->, you could write >>>>> >>>>> d := &errDB{db: d} >>>>> stmt := d.Prepare("INSERT INTO…") >>>>> res := stmt.Exec(…) >>>>> id := res.LastInsertId() >>>>> stmt := d.Prepare("UPDATE…") >>>>> res := stmt.Exec(…, id) >>>>> affect := res.RowsAffected() >>>>> return d.err >>>>> >>>>> Now… this isn't really nice either (see above. sql isn't really >>>>> well-designed for this. You'd probably try and implement a driver for >>>>> this, >>>>> but sql doesn't make that easy either). And it's a bad idea for all the >>>>> same reasons the watch-proposal isn't a great idea here. But it >>>>> illustrates >>>>> a far more effective take-away from that blog post. >>>>> >>>>> >>>>>> >>>>>> 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 golang-nuts...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>> 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 golang-nuts...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- 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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.