понедельник, 24 апреля 2017 г., 16:09:56 UTC+3 пользователь Rob 'Commander' Pike написал: > > Your point 3 misses an important practical detail. Packages that use > recover internally call panic with an identifiable type and the recover > code checks whether the type is the expected one and, if not, panics again, > thus behaving like any other unexpected problem. > > See encoding/gob/error.go for an example. > > More generally, recover is excellent for isolation of errors in > multi-client servers. > > Even more generally, blanket statements about what to do or not do with > the features of a programming language are too often taken as strict rules > rather than thoughtful guidelines. "Don't use panic or recover" is an > example. Panic and recover are the perfect tools for some problem and > prohibiting them outright eliminates some powerful designs. > > -rob >
Rob, you just described panic as an generic exception mechanism. Then why Go has no convenient exceptions? And what about unrecoverable panic? C-style `assert`? `net/http` recovers from all panics currently, and it is clear design flaw. There should be distinction between "safe to recover" errors/panics and "have to stop execution" panics/asserts. > > On Mon, Apr 24, 2017 at 5:40 AM, 'Axel Wagner' via golang-nuts < > golan...@googlegroups.com <javascript:>> wrote: > >> My 2¢: >> 1. panic if an API is clearly used wrongly. If a dev chose to not read >> the docs for this one function and ignore how it's supposed to be called, >> then what else have they not read the docs of? If you can detect that a >> program is incorrect, failing loudly seems the right thing to do >> 2. Do not panic, if an API is used correctly; this includes failing >> syscalls that you'd expect to be correct if the API is correctly - your >> expectations might be wrong. Return an error on non-code related problems. >> 3. Don't recover, pretty much universally. Even using it as a >> control-flow mechanism seems broken to me; it would hide actual programming >> errors that *should* crash >> 4. If you are using a library that panics and you dislike that, I see two >> possible root-causes; a) you are using a library that badly coded >> (according to 2) or b) your program is buggy. In either case, the correct >> solution doesn't seem to paper over either bug, but to complain loudly so >> it gets fixed. >> 5. Be prepared for your stuff crashing, from a dev-induced panic or a >> runtime-induced panic. >> >> And as a preventative measure: I say this as a person who was oncall >> while a large service, written in a memory safe language, crashed globally >> and took our service out. I know it's hard to be prepared for these things >> and to recover from them, but I *still* believe that crashing is the >> right thing to do. You can not prevent crashes, even globally synchronized >> ones, to happen. Because programmers are just humans and humans are >> fallible and stuff happens. You need to be prepared to deal with human >> failures. >> >> On Mon, Apr 24, 2017 at 2:24 PM, Sokolov Yura <funny....@gmail.com >> <javascript:>> wrote: >> >>> >>> > Notice that real unrecoverable errors are not subject to >>> defer/recover() at all. >>> >>> If so, then how should I raise unrecoverable error, if I really know >>> that it is unrecoverable? >>>> >>>> Something like C style assert(): "guy, something goes completely wrong, >>> and it is >>> much better to stop functioning than corrupt your data further" >>> >>> > It's sometimes a perfectly valid and quite reasonable approach to >>> defer a recover() in an API function and panic(forWhateverReason) somewhere >>> down the call chain. >>> > A recursive descent parser may get much simpler and easier to code, >>> for example. >>> >>> I don't agree. I call it "abusing". In absence of other comfortable >>> ways, panic is abused to unwind stack fast (upto recover). >>> I could be mistaken. >>> >>> -- >>> 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...@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.