From: Eric Wong Date: 2013-07-12T03:55:16+09:00 Subject: [ruby-core:55956] Re: [ruby-trunk - Feature #5138] Add nonblocking IO that does not use exceptions for EOF and EWOULDBLOCK 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. 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...