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 can't. And that's why I am proposing to be a little bit open to new 
ideas.

Every modern language I know of has some sort of try...catch construct.


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 <javascript:>> 
> 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 <javascript:>.
>> 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.

Reply via email to