From: "ioquatix (Samuel Williams)" Date: 2022-09-23T06:35:00+00:00 Subject: [ruby-core:110032] [Ruby master Feature#18630] Introduce general `IO#timeout` and `IO#timeout=` for blocking operations. Issue #18630 has been updated by ioquatix (Samuel Williams). @matz @naruse do you agree with the current PR? ``` TimeoutError < StandardError IO::TimeoutError < TimeoutError ``` Or do you think it makes more sense: ``` module TimeoutError end class IO::TimeoutError < IOError include TimeoutError end class Regexp::TimeoutError < RegexpError include TimeoutError end ``` and so on. ---------------------------------------- Feature #18630: Introduce general `IO#timeout` and `IO#timeout=` for blocking operations. https://bugs.ruby-lang.org/issues/18630#change-99283 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal ---------------------------------------- I would like us to consider introducing a general IO timeout for all (non-)blocking operations, specified per-IO instance. It's useful for ensuring programs don't stop responding or spend an unreasonable amount of time waiting for IO operations. There are effectively two kinds of interfaces that we need to address: - Those that already have a timeout argument (e.g. `wait_readable`) and we follow the existing semantics. - Those that don't have a timeout argument or timeout semantics (e.g. `puts`, `gets`), and thus probably need to raise an exception on timeout. We have three possible kinds of exceptions we could raise: - `Errno::ETIMEDOUT` - `Timeout::Error` (from `timeout.rb`) - Introduce `IO::Timeout` or something similar. Timeout isn't necessarily an error condition. There are different arguments for whether we should define: ```ruby class IO::Timeout < Exception end # or class IO::Timeout < StandardError end ``` I believe the latter (`StandardError`) is more practical but I'm open to either option. I might have more specific arguments later why one is better than the other after testing in a practical system. There is already a PR to try it out: https://github.com/ruby/ruby/pull/5653 -- https://bugs.ruby-lang.org/ Unsubscribe: