From: Aaron Patterson Date: 2013-07-12T05:55:17+09:00 Subject: [ruby-core:55957] Re: [ruby-trunk - Feature #5138] Add nonblocking IO that does not use exceptions for EOF and EWOULDBLOCK On Fri, Jul 12, 2013 at 03:55:16AM +0900, Eric Wong wrote: > Aaron Patterson wrote: > > It occurs to me that this is pretty similar to IO#readpartial. The main > > difference being that readpartial automatically retries on EWOULDBLOCK > > and raises an EOF error. Maybe there should be a `try_readpartial` in > > addition to the proposed `try_read_nonblock`? > > It's always bothered me that IO#readpartial raises EOFError, too > (especially when IO#read returns nil). So yes, try_readpartial > would be good, but try_*nonblock is much more important since > EAGAIN is more common than EOF. Ah, I was thinking that IO#try_readpartial would work exactly the same as try_*nonblock, but with a buffer (no exceptions, no automatic retry). > Also, I also wonder if there's a generic way for us to implement > "expected exceptions": > > - without needing to introduce additional methods > - without allocating new objects for common exceptions > > Perhaps similar to catch/throw... > > Maybe: > > begin_expect(Errno::ENOENT) > # cause the _class_ Errno::ENOENT to be raised, > # not an instance of Errno::ENOENT > File.open("/possibly/non-existent/file") > rescue Errno::ENOENT => e > e == Errno::ENOENT # note the '==' (not '===') > end > > Otherwise, we might end up needing try_open, try_stat, try_lstat, > try_link, try_unlink, try_rename, etc to avoid racy/wasteful > File.exist? calls... I'm not sure. The big thing for me about the try_* methods is that I can use `loop` as the looping construct, not rescue / retry. -- Aaron Patterson http://tenderlovemaking.com/