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.

Reply via email to