From: "ioquatix (Samuel Williams)" Date: 2022-03-31T11:25:35+00:00 Subject: [ruby-core:108138] [Ruby master Feature#18630] Introduce general `IO#timeout` and `IO#timeout=`for all (non-)blocking operations. Issue #18630 has been updated by ioquatix (Samuel Williams). I am fine with `IO::TimeoutError` but again, I'm not sure it's strictly an error. Not all exceptions or errors have those naming conventions, `Errno::E*` being an obvious one, but there are several others: ``` > Exception.subclasses => [IRB::Abort, ErrorHighlight::Spotter::NonAscii, SystemStackError, NoMemoryError, SecurityError, ScriptError, StandardError, SignalException, fatal, SystemExit] ``` ``` > SignalException.subclasses => [Interrupt] ``` ``` > StandardError.subclasses.map(&:to_s).grep_v(/Error/) => ["IRB::IllegalRCGenerator", "IRB::UndefinedPromptMode", "IRB::CantChangeBinding", "IRB::CantShiftToMultiIrbMode", "IRB::NoSuchJob", "IRB::IrbSwitchedToCurrentThread", "IRB::IrbAlreadyDead", "IRB::IllegalParameter", "IRB::CantReturnToNormalMode", "IRB::UnrecognizedSwitch", "RubyLex::TerminateLineInput", "Gem::TSort::Cyclic"] ``` Basically, I think there are two questions: 1. Should it be called `IO::Timeout` or `IO::TimeoutError`. 2. Should it be `< Exception` or `< StandardError`. I don't have strong opinion about either. For (1) I guess it's matter of taste and opinion whether a timeout is an error or not. To me, whether it's an error depends on context. But for most cases, it could be considered exceptional except when a timeout is a reasonable possibility. `read` with timeout is exceptional, but `wait_readable` with timeout is not, since it has clear existing semantics for dealing with "exceeding the given timeout". So, with that in mind, it probably makes sense that in most cases, the timeout would be unexpected and thus an error. For (2) I've gone both ways on this in the past and finally settled on `< StandardError` being more reasonable. However it's true that in many cases, a timeout is significantly different from a normal "error". It's the reason why `SystemExit` is an exception and not an error, is the same motivating factor for why timeouts should be an exception and not an error. I would personally like to hear if @matz has an opinion on this. Basically, I think we agree on `IO::TimeoutError < StandardError` but I don't have a strong opinion on this. ---------------------------------------- Feature #18630: Introduce general `IO#timeout` and `IO#timeout=`for all (non-)blocking operations. https://bugs.ruby-lang.org/issues/18630#change-97114 * 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: