8 ms·
No, you don't. You should never be using recover as a matter of course. You seem really hung-up on this point. Can you link to some code that illustrates your
by redbad 13y ago
No, you don't. You should never be using recover as a matter of course.
You seem really hung-up on this point. Can you link to some code that illustrates your concerns?
- burntsushi 13y agoThat's just not true. There are very useful idioms for panic/recover, like when your code is profligate with errors (parsing, database work, etc.) It's even used in the standard library: http://golang.org/src/pkg/text/template/exec.go#L93 http://golang.org/src/pkg/text/template/exec.go#L93 (I use the pattern myself in certain situations. It's extremely useful.)
- redbad 13y agoNote I said "as a matter of course". I agree it's useful in certain very limited circumstances, like parsing. But certainly not database work, unless you have a very different idea of what that entails than I do. Link to code?
- burntsushi 13y agoIt's the same principle as parsing. Database work involves lots of querying, scanning, etc. All of these operations produce errors. In the work that I do, the response to an error is usually, "rollback, show error to user." This makes it ideal for panic/recover. (And this can work well for either command line applications or web applications.)
- vertex-four 13y agoPanicking isn't done when a database operation fails. Returning an error value is. It's just like old-school C. Panics are for programming errors or things like out of memory conditions, not errors in ordinary operation, even when components are failing.
- beatgammit 13y agoExactly. I have exactly two panics in my ~15k line server. Both are in initialization code that will probably never get called, so it will fail very early on in the code. The rest of my code looks like this: func getRecord(args...) (err error) { if err := doSomethingRisky(); err != nil { return err } if err := doSomethingElseRisky(); err != nil { return err } ... other code ... return nil } func processRecord() error { if err := getRecord(args...); err != nil { return err } ... do other stuff ... return nil } All the way down the stack. It's certainly a little more code, but it forces you to at least acknowledge all errors. If you want a stack-trace, you can always use the runtime package.
- burntsushi 13y agoNo, this isn't what I'm talking about. See my response: https://news.ycombinator.com/item?id=7222197 https://news.ycombinator.com/item?id=7222197
- burntsushi 13y agoI hate to be rude, but I feel like you jumped into this thread without reading the context. I'm not talking about panicing instead of returning errors. I'm talking about using an idiom---which is used in the Go standard library (see my link up-thread)---to make error handling more terse when you're working with code that is otherwise profligate with checking errors. At no point is a panic exposed to the user of a program or to the client of a library. At no point are errors ignored. The panics are kept within package and converted to error values.
- redbad 13y agoGuarding your library boundary with a recover doesn't absolve your library internals from being nonidiomatic by using panics. (That the stdlib uses panic/recover in a few specific places does not make it broadly idiomatic.) Without seeing specific code I can't say for sure, but it's very unlikely that any database interaction code is best modeled with panic/recover for error handling. I'm very curious to see the source, at this point.
- waps 13y agoThis is just another example of Go's fundamental attitude. Stuff is available for the language designers, but not for you : * generic functions (e.g. append) * generic data types (e.g. slices) * exceptions (like illustrated above) * special case syntax * Custom event loops * precompiler macros (very bad to use, horrible, blah blah ... except of course for the people imposing this restriction, and YES they're using it amongst other things to workaround the lack of generics in C) ... This attitude was common in middle-90s "generic" programming languages like Ocaml, Modula-2 and others. You should simply look at Go as one of those languages and treat it as such. If this attitude bothers you, you should look at C++0x and D.
- burntsushi 13y agoI've read your comment twice and I cannot see any pertinent connection between it and what I said.
- justinsb 13y agoAgreed, you should be using defer, not recover. The canonical examples are closing a file and releasing a mutex. Both have code samples here: http://blog.golang.org/defer-panic-and-recover http://blog.golang.org/defer-panic-and-recover I'm confused as to what you guys are saying: are you saying that you don't need to handle exceptions (whether using defer or recover), or that it's better to use defer over recover? I take exception to the former, totally agree with the latter.
- redbad 13y agodefer and recover have nothing to do with each other, except that in the few circumstances where it's appropriate to use recover, you often do it within a defer block. > are you saying that you don't need to handle exceptions > (whether using defer or recover) Go doesn't have exceptions. You don't need to handle (i.e. explicitly deal with) panics via recover. If you do, especially if you're not making the panics yourself in e.g. a parsing package, that's a bad code smell and you're probably doing something wrong.
- enneff 13y agodefer doesn't "handle" panics. It won't stop your program from crashing. You have serious gaps in your knowledge on this subject.
- justinsb 13y agoMy understanding is that defer is the broad equivalent of a Java finally block, and recover is the broad equivalent of a Java catch block. I think of both as ways of handling exceptions, although I see how the word "handle" could be interpreted in a way that makes my statements nonsensical. By handling I meant "doing the right thing", not "swallowing the panic/exception"; I apologize for the ambiguity you found. If you do still think I have gaps in my knowledge, I humbly suggest that you briefly fill in those gaps with facts; it should save you time in the long run and will likely win you a few converts!
- enneff 13y ago