From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on starla X-Spam-Level: X-Spam-Status: No, score=-1.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HTML_MESSAGE,MAILING_LIST_MULTI,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 Received: from nue.mailmanlists.eu (nue.mailmanlists.eu [94.130.110.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 38C331F4BE for ; Tue, 29 Oct 2024 18:09:18 +0000 (UTC) Authentication-Results: dcvr.yhbt.net; dkim=pass (1024-bit key; unprotected) header.d=ml.ruby-lang.org header.i=@ml.ruby-lang.org header.a=rsa-sha256 header.s=mail header.b=dE0hgdMA; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=OGFLoZDd; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ml.ruby-lang.org; s=mail; t=1730225356; bh=9IgHdr+cJFHasw9nw6DXKpimEoCPAtx15Zaqm8MG8xg=; h=References:In-Reply-To:Date:To:Reply-To:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From:Cc:From; b=dE0hgdMAx5/khZLxlnWJiDq8wnLA4WIPNvXXQqrDI0m+Yxc8btviaA1UNynJUVzda bRWrixL1sroqG7QKh1rn0IfjvZy5wKjo0FSw1Jbw8tL9Mi0ONTjubSIOhCbaLK5LNp 6+v733a3ErtjtdOqtgfn2g2+iqCD/KSqCz2wiocY= Received: from nue.mailmanlists.eu (localhost [IPv6:::1]) by nue.mailmanlists.eu (Postfix) with ESMTP id 3A53244B72 for ; Tue, 29 Oct 2024 18:09:16 +0000 (UTC) Authentication-Results: nue.mailmanlists.eu; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=OGFLoZDd; dkim-atps=neutral Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by nue.mailmanlists.eu (Postfix) with ESMTPS id 7FF5244A51 for ; Tue, 29 Oct 2024 18:08:25 +0000 (UTC) Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-a9a0ec0a94fso799264466b.1 for ; Tue, 29 Oct 2024 11:08:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730225245; x=1730830045; darn=ml.ruby-lang.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=bqDc+k2QGzvZoZlN0DjYOqO4J2Cke4KwGGk/rsaps4A=; b=OGFLoZDdhi8V4K5GmTEhZMpeMlnPsG/IS92OU8tVwuWoMJD9i7e7Evvh04GqlShLYU sV+da3dYnAxG7+ensr4X+1DvnzvfRAIVW3Xfri8G9ggIwSuliAzkUVZSVtNqfZsCpOQe glQMToGCgwGnGP09lRPlDc9226CKNPDJIMSoydlsDYXxVj0GXP3C9V8JFOUyBPHiRYua +iPV/bAEeXdZngAuMzphM+NBTQosffrhSPitCX9+xlsatMCLx9JhzwM2JFPoG72feCj9 8mijwebINvD6KwdG81dLWY8S2E+QzwXtjBE/0lPVlIhrr5lDrJWmIJJvn1jVlJM22rpa 0Qqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730225245; x=1730830045; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=bqDc+k2QGzvZoZlN0DjYOqO4J2Cke4KwGGk/rsaps4A=; b=LcvJ1oiFxHaoOXKr/ysEe/Dx8mK2UCm8W+Oi0vu/aNZnXIpGv8LQRya821dPKD9Atw C/qyffu18geN3UOOsQ+O8Hpgeywcu6hRGKp/X3KuxDP1vZqSVZYwP+dSD4fxjsdEqyQp 5JzsRrLBuMt41f0gky+i5Q0QFMh6DEzh/xqBQwWUtveIymvKMBmVrcIlFO9kqC6xA6CO QF1h0VLjJDNqsbI788AVLB8LswsCmilk21BCT8pyV1EZuICdoaYGebBFD/0RzB7T+CKg 15pAZ3PdV3hFUjj4H8K9nxxHfGwoGkvEH2Z1WLXWpWQMSkCaPXagL5z5SdbPkRAxstHr jr3w== X-Gm-Message-State: AOJu0Yz+VKZKIpL/6GHze2V2Z7dtnjKiuzwlFNZMNxh9umLDqDqVf3Ok hioD/6oLKKn19umN/SD/cCIU+1Z0w6WOLDQcWGIB7rwqYM9UwGFUhyTdUuTi/chIui+7Q9gKuFs a47ZvEqYyXF4Z0MJEPnV7dbqi35VnO76J X-Google-Smtp-Source: AGHT+IHuA4mMwy3ZC22IT18L6U5zOWvDhoTqlOJ2t36jNh0QlfVipBpCyon+CxHdWGld6JAzlUfcV5Jj5QetQcKY+S4= X-Received: by 2002:a17:907:e88:b0:a99:7676:ceb7 with SMTP id a640c23a62f3a-a9de5f49bf7mr1198637466b.26.1730225244391; Tue, 29 Oct 2024 11:07:24 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Tue, 29 Oct 2024 14:07:08 -0400 Message-ID: To: Ruby developers Message-ID-Hash: UCSTS4EY35M64K2NLMGWXQZ7JZINQ7MW X-Message-ID-Hash: UCSTS4EY35M64K2NLMGWXQZ7JZINQ7MW X-MailFrom: halostatue@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.9 Precedence: list Reply-To: Ruby developers Subject: [ruby-core:119639] Re: Behavior of raising from rescue blocks when multiple rescue blocks exist List-Id: Ruby developers Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Austin Ziegler via ruby-core Cc: Rodrigo Rosenfeld Rosas , Austin Ziegler Content-Type: multipart/mixed; boundary="===============7037771296346547184==" --===============7037771296346547184== Content-Type: multipart/alternative; boundary="00000000000012d5bd0625a1753b" --00000000000012d5bd0625a1753b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable RuntimeError is a descendant of StandardError, and rescues happen exactly once per exception handling block. That is, your first code example will never hit RuntimeError because it's swallowed by the implicit StandardError. Here's a class tree of Exception from my local irb: - Exception |- ErrorHighlight::Spotter::NonAscii |- IRB::Abort |- IRB::LoadAbort |- NoMemoryError |- ScriptError | |- LoadError | | `- Gem::LoadError | | |- Gem::ConflictError | | `- Gem::MissingSpecError | | `- Gem::MissingSpecVersionError | |- NotImplementedError | `- SyntaxError |- SecurityError |- SignalException | `- Interrupt |- StandardError | |- ArgumentError | | |- Gem::Requirement::BadRequirementError | | |- IO::Buffer::MaskError | | `- UncaughtThrowError | |- EncodingError | | |- Encoding::CompatibilityError | | |- Encoding::ConverterNotFoundError | | |- Encoding::InvalidByteSequenceError | | `- Encoding::UndefinedConversionError | |- FiberError | |- Fiddle::Error | | |- Fiddle::ClearedReferenceError | | `- Fiddle::DLError | |- Gem::Molinillo::ResolverError | | |- Gem::Molinillo::CircularDependencyError | | |- Gem::Molinillo::NoSuchDependencyError | | `- Gem::Molinillo::VersionConflict | |- Gem::TSort::Cyclic | |- IOError | | |- EOFError | | `- IO::TimeoutError | |- IRB::CantChangeBinding | |- IRB::CantReturnToNormalMode | |- IRB::Command::CommandArgumentError | |- IRB::IllegalParameter | |- IRB::IrbAlreadyDead | |- IRB::IrbSwitchedToCurrentThread | |- IRB::NoSuchJob | |- IRB::RubyLex::TerminateLineInput | |- IRB::SourceFinder::EvaluationError | |- IRB::UndefinedPromptMode | |- IRB::UnrecognizedSwitch | |- IndexError | | |- KeyError | | `- StopIteration | | |- ClosedQueueError | | `- Ractor::ClosedError | |- JSON::JSONError | | |- JSON::GeneratorError | | |- JSON::MissingUnicodeSupport | | `- JSON::ParserError | | `- JSON::NestingError | | `- JSON::CircularDatastructure | |- LocalJumpError | |- Math::DomainError | |- NameError | | `- NoMethodError | |- NoMatchingPatternError | | `- NoMatchingPatternKeyError | |- RangeError | | `- FloatDomainError | |- RegexpError | | `- Regexp::TimeoutError | |- Reline::ConfigEncodingConversionError | |- Reline::Terminfo::TerminfoError | |- Ripper::TokenPattern::Error | | |- Ripper::TokenPattern::CompileError | | `- Ripper::TokenPattern::MatchError | |- RuntimeError | | |- FrozenError | | |- Gem::Exception | | | |- Gem::CommandLineError | | | |- Gem::DependencyError | | | | |- Gem::DependencyResolutionError | | | | `- Gem::UnsatisfiableDependencyError | | | |- Gem::DependencyRemovalException | | | |- Gem::DocumentError | | | |- Gem::EndOfYAMLException | | | |- Gem::FilePermissionError | | | |- Gem::FormatException | | | |- Gem::GemNotFoundException | | | | `- Gem::SpecificGemNotFoundException | | | |- Gem::GemNotInHomeException | | | |- Gem::ImpossibleDependenciesError | | | |- Gem::InstallError | | | | `- Gem::RuntimeRequirementNotMetError | | | |- Gem::InvalidSpecificationException | | | |- Gem::OperationNotSupportedError | | | |- Gem::RemoteError | | | |- Gem::RemoteInstallationCancelled | | | |- Gem::RemoteInstallationSkipped | | | |- Gem::RemoteSourceException | | | |- Gem::RequestSet::Lockfile::ParseError | | | |- Gem::RubyVersionMismatch | | | |- Gem::UninstallError | | | |- Gem::UnknownCommandError | | | |- Gem::VerificationError | | | `- Gem::WebauthnVerificationError | | |- IO::Buffer::AccessError | | |- IO::Buffer::AllocationError | | |- IO::Buffer::InvalidatedError | | |- IO::Buffer::LockedError | | |- RDoc::Error | | |- Ractor::Error | | | |- Ractor::IsolationError | | | |- Ractor::MovedError | | | |- Ractor::RemoteError | | | `- Ractor::UnsafeError | | `- Reline::Config::InvalidInputrc | |- SystemCallError | | |- Errno::E2BIG | | |- Errno::EACCES | | |- Errno::EADDRINUSE | | |- Errno::EADDRNOTAVAIL | | |- Errno::EAFNOSUPPORT | | |- Errno::EAGAIN | | | |- IO::EAGAINWaitReadable | | | `- IO::EAGAINWaitWritable | | |- Errno::EALREADY | | |- Errno::EAUTH | | |- Errno::EBADARCH | | |- Errno::EBADEXEC | | |- Errno::EBADF | | |- Errno::EBADMACHO | | |- Errno::EBADMSG | | |- Errno::EBADRPC | | |- Errno::EBUSY | | |- Errno::ECANCELED | | |- Errno::ECHILD | | |- Errno::ECONNABORTED | | |- Errno::ECONNREFUSED | | |- Errno::ECONNRESET | | |- Errno::EDEADLK | | |- Errno::EDESTADDRREQ | | |- Errno::EDEVERR | | |- Errno::EDOM | | |- Errno::EDQUOT | | |- Errno::EEXIST | | |- Errno::EFAULT | | |- Errno::EFBIG | | |- Errno::EFTYPE | | |- Errno::EHOSTDOWN | | |- Errno::EHOSTUNREACH | | |- Errno::EIDRM | | |- Errno::EILSEQ | | |- Errno::EINPROGRESS | | | |- IO::EINPROGRESSWaitReadable | | | `- IO::EINPROGRESSWaitWritable | | |- Errno::EINTR | | |- Errno::EINVAL | | |- Errno::EIO | | |- Errno::EISCONN | | |- Errno::EISDIR | | |- Errno::ELAST | | |- Errno::ELOOP | | |- Errno::EMFILE | | |- Errno::EMLINK | | |- Errno::EMSGSIZE | | |- Errno::EMULTIHOP | | |- Errno::ENAMETOOLONG | | |- Errno::ENEEDAUTH | | |- Errno::ENETDOWN | | |- Errno::ENETRESET | | |- Errno::ENETUNREACH | | |- Errno::ENFILE | | |- Errno::ENOATTR | | |- Errno::ENOBUFS | | |- Errno::ENODATA | | |- Errno::ENODEV | | |- Errno::ENOENT | | |- Errno::ENOEXEC | | |- Errno::ENOLCK | | |- Errno::ENOLINK | | |- Errno::ENOMEM | | |- Errno::ENOMSG | | |- Errno::ENOPOLICY | | |- Errno::ENOPROTOOPT | | |- Errno::ENOSPC | | |- Errno::ENOSR | | |- Errno::ENOSTR | | |- Errno::ENOSYS | | |- Errno::ENOTBLK | | |- Errno::ENOTCONN | | |- Errno::ENOTDIR | | |- Errno::ENOTEMPTY | | |- Errno::ENOTRECOVERABLE | | |- Errno::ENOTSOCK | | |- Errno::ENOTSUP | | |- Errno::ENOTTY | | |- Errno::ENXIO | | |- Errno::EOPNOTSUPP | | |- Errno::EOVERFLOW | | |- Errno::EOWNERDEAD | | |- Errno::EPERM | | |- Errno::EPFNOSUPPORT | | |- Errno::EPIPE | | |- Errno::EPROCLIM | | |- Errno::EPROCUNAVAIL | | |- Errno::EPROGMISMATCH | | |- Errno::EPROGUNAVAIL | | |- Errno::EPROTO | | |- Errno::EPROTONOSUPPORT | | |- Errno::EPROTOTYPE | | |- Errno::EPWROFF | | |- Errno::ERANGE | | |- Errno::EREMOTE | | |- Errno::EROFS | | |- Errno::ERPCMISMATCH | | |- Errno::ESHLIBVERS | | |- Errno::ESHUTDOWN | | |- Errno::ESOCKTNOSUPPORT | | |- Errno::ESPIPE | | |- Errno::ESRCH | | |- Errno::ESTALE | | |- Errno::ETIME | | |- Errno::ETIMEDOUT | | |- Errno::ETOOMANYREFS | | |- Errno::ETXTBSY | | |- Errno::EUSERS | | |- Errno::EXDEV | | `- Errno::NOERROR | |- ThreadError | |- TypeError | `- ZeroDivisionError |- SystemExit | `- Gem::SystemExitException |- SystemStackError `- fatal -a On Tue, Oct 29, 2024 at 8:48=E2=80=AFAM Rodrigo Rosenfeld Rosas via ruby-co= re < ruby-core@ml.ruby-lang.org> wrote: > Hello, I couldn't find any documentation about the subject, so I thought > this behavior should be probably documented. > > Given the following code: > > def raise_error > raise "runtime error message" > rescue =3D> e > "StandardError: #{e.message}" > rescue RuntimeError =3D> e > puts "RuntimeError raised: #{e.message}" > raise StandardError, "standard error message" > end > > # same, but the order of the rescue blocks are inverted > def raise_error2 > raise "runtime error message" > rescue RuntimeError =3D> e > puts "RuntimeError raised: #{e.message}" > raise StandardError, "standard error message" > rescue =3D> e > "StandardError: #{e.message}" > end > > p ["raise_error", raise_error ] > > begin > p ["raise_error2", raise_error2] > rescue =3D> e > puts "raise_error2 raised: #{e.message}" > end > > When we run it, this is the output in Ruby 3.3.5: > > ["raise_error", "StandardError: runtime error message"] > > RuntimeError raised: runtime error message > > raise_error2 raised: standard error message > > > In the first case (raise_error), the code raised from the RuntimeError > rescue block is rescued by the StandardError block, but when inverting th= e > order of the rescue blocks (raise_error2) then this won't happen. > > Is this part of the specs? Is this behavior documented somewhere? Could > this behavior differ in different Ruby implementations and versions? Or c= an > we rely on such behavior? > > > This chapter doesn't include such case in its examples: > > https://ruby-doc.com/docs/ProgrammingRuby/html/tut_exceptions.html > > Or this documentation about Exceptions: > > https://ruby-doc.org/3.3.5/syntax/exceptions_rdoc.html > > Is there a recommended way for wrapping exceptions into a particular one > and then handling that exception from within the same method rescue block= s? > Or is this considered a bad practice? > > > ______________________________________________ > ruby-core mailing list -- ruby-core@ml.ruby-lang.org > To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org > ruby-core info -- > https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/ --=20 Austin Ziegler =E2=80=A2 halostatue@gmail.com =E2=80=A2 austin@halostatue.c= a http://www.halostatue.ca/ =E2=80=A2 http://twitter.com/halostatue --00000000000012d5bd0625a1753b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
RuntimeError is a descendant of StandardError, and rescues= happen exactly once per exception handling=C2=A0block.

= That is, your first code example will never hit RuntimeError because it'= ;s swallowed by the implicit StandardError.

Here&#= 39;s a class tree of Exception from my local irb:

= - Exception
=C2=A0 =C2=A0 |- ErrorHighlight::Spotter::NonAscii
=C2=A0= =C2=A0 |- IRB::Abort
=C2=A0 =C2=A0 |- IRB::LoadAbort
=C2=A0 =C2=A0 |= - NoMemoryError
=C2=A0 =C2=A0 |- ScriptError
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0|- LoadError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Gem::L= oadError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 |- G= em::ConflictError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 = =C2=A0 `- Gem::MissingSpecError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0`- Gem::MissingSpecVersionError=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- NotImplementedError
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0`- SyntaxError
=C2=A0 =C2=A0 |- SecurityError
=C2=A0 =C2=A0= |- SignalException
=C2=A0 =C2=A0 | =C2=A0 =C2=A0`- Interrupt
=C2=A0 = =C2=A0 |- StandardError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- ArgumentError=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::Requirement::BadRequir= ementError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- IO::Buffer::Ma= skError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- UncaughtThrowErro= r
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- EncodingError
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0|- Encoding::CompatibilityError
=C2=A0 =C2=A0 |= =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Encoding::ConverterNotFoundError
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Encoding::InvalidByteSequenceError<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Encoding::UndefinedConver= sionError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- FiberError
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0|- Fiddle::Error
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Fiddle::ClearedReferenceError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0`- Fiddle::DLError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- Gem::Molini= llo::ResolverError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::M= olinillo::CircularDependencyError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Gem::Molinillo::NoSuchDependencyError
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0`- Gem::Molinillo::VersionConflict
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0|- Gem::TSort::Cyclic
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IOErr= or
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- EOFError
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- IO::TimeoutError
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0|- IRB::CantChangeBinding
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- I= RB::CantReturnToNormalMode
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::Command:= :CommandArgumentError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::IllegalParame= ter
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::IrbAlreadyDead
=C2=A0 =C2=A0= | =C2=A0 =C2=A0|- IRB::IrbSwitchedToCurrentThread
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0|- IRB::NoSuchJob
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::RubyLex= ::TerminateLineInput
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::SourceFinder::= EvaluationError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::UndefinedPromptMode=
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- IRB::UnrecognizedSwitch
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0|- IndexError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- KeyError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- StopIte= ration
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 |- Clo= sedQueueError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0= `- Ractor::ClosedError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- JSON::JSONError<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- JSON::GeneratorError
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- JSON::MissingUnicodeSupport<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- JSON::ParserError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 `- JSON::NestingErr= or
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0`- JSON::CircularDatastructure
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|-= LocalJumpError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- Math::DomainError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0|- NameError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0`- NoMethodError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- NoMatching= PatternError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- NoMatchingPa= tternKeyError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- RangeError
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- FloatDomainError
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0|- RegexpError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0= `- Regexp::TimeoutError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- Reline::ConfigEn= codingConversionError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- Reline::Terminfo::= TerminfoError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- Ripper::TokenPattern::Erro= r
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Ripper::TokenPattern::C= ompileError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Ripper::Token= Pattern::MatchError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- RuntimeError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- FrozenError
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::Exception
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::CommandLineError
=C2=A0 =C2=A0 = | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::DependencyError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- G= em::DependencyResolutionError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Gem::UnsatisfiableDependencyError
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::Dependen= cyRemovalException
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Gem::DocumentError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0= | =C2=A0 =C2=A0|- Gem::EndOfYAMLException
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|= =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::FilePermissionError
=C2=A0 =C2=A0 |= =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::FormatException
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::GemNotFound= Exception
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0| = =C2=A0 =C2=A0`- Gem::SpecificGemNotFoundException
=C2=A0 =C2=A0 | =C2=A0= =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::GemNotInHomeException
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::ImpossibleD= ependenciesError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Gem::InstallError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|= =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Gem::RuntimeRequirementNotMetError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::InvalidSpec= ificationException
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Gem::OperationNotSupportedError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::RemoteError
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::RemoteInstallationCancelled
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::RemoteIn= stallationSkipped
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Gem::RemoteSourceException
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0| =C2=A0 =C2=A0|- Gem::RequestSet::Lockfile::ParseError
=C2=A0= =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem::RubyVersionMis= match
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Gem:= :UninstallError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Gem::UnknownCommandError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0| =C2=A0 =C2=A0|- Gem::VerificationError
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Gem::WebauthnVerificationError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- IO::Buffer::AccessError
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- IO::Buffer::AllocationError
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- IO::Buffer::InvalidatedError=
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- IO::Buffer::LockedError<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- RDoc::Error
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Ractor::Error
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Ractor::IsolationError
=C2=A0= =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Ractor::MovedError<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Ractor::Re= moteError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0`- = Ractor::UnsafeError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Relin= e::Config::InvalidInputrc
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- SystemCallErro= r
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::E2BIG
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EACCES
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EADDRINUSE
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::EADDRNOTAVAIL
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0|- Errno::EAFNOSUPPORT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::EAGAIN
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0| =C2=A0 =C2=A0|- IO::EAGAINWaitReadable
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0`- IO::EAGAINWaitWritable
=C2=A0 =C2=A0= | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EALREADY
=C2=A0 =C2=A0 | =C2=A0= =C2=A0| =C2=A0 =C2=A0|- Errno::EAUTH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0|- Errno::EBADARCH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::EBADEXEC
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Err= no::EBADF
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EBADMACH= O
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EBADMSG
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EBADRPC
=C2=A0 =C2=A0= | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EBUSY
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::ECANCELED
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::ECHILD
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::ECONNABORTED
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|-= Errno::ECONNREFUSED
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errn= o::ECONNRESET
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EDEA= DLK
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EDESTADDRREQ=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EDEVERR
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EDOM
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EDQUOT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|= =C2=A0 =C2=A0|- Errno::EEXIST
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::EFAULT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno= ::EFBIG
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EFTYPE
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EHOSTDOWN
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EHOSTUNREACH
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EIDRM
=C2=A0 =C2=A0 | =C2=A0= =C2=A0| =C2=A0 =C2=A0|- Errno::EILSEQ
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::EINPROGRESS
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0= =C2=A0| =C2=A0 =C2=A0|- IO::EINPROGRESSWaitReadable
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0| =C2=A0 =C2=A0`- IO::EINPROGRESSWaitWritable
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EINTR
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EINVAL
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EIO
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::EISCONN
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::EISDIR
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno= ::ELAST
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ELOOP
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EMFILE
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EMLINK
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EMSGSIZE
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0|- Errno::EMULTIHOP
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0|- Errno::ENAMETOOLONG
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Errno::ENEEDAUTH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|-= Errno::ENETDOWN
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::E= NETRESET
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENETUNREA= CH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENFILE
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOATTR
=C2=A0 =C2=A0= | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOBUFS
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::ENODATA
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::ENODEV
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::ENOENT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno= ::ENOEXEC
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOLCK=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOLINK
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOMEM
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOMSG
=C2=A0 =C2=A0 | =C2=A0 =C2= =A0| =C2=A0 =C2=A0|- Errno::ENOPOLICY
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0|- Errno::ENOPROTOOPT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Errno::ENOSPC
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Er= rno::ENOSR
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOSTR<= br>=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOSYS
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOTBLK
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENOTCONN
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::ENOTDIR
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::ENOTEMPTY
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Errno::ENOTRECOVERABLE
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Errno::ENOTSOCK
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- = Errno::ENOTSUP
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENO= TTY
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ENXIO
=C2= =A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EOPNOTSUPP
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EOVERFLOW
=C2=A0 =C2=A0 | = =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EOWNERDEAD
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::EPERM
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0|- Errno::EPFNOSUPPORT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 = =C2=A0|- Errno::EPIPE
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Err= no::EPROCLIM
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROC= UNAVAIL
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROGMISMA= TCH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROGUNAVAIL=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROTO
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROTONOSUPPORT
=C2=A0 = =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPROTOTYPE
=C2=A0 =C2=A0 = | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EPWROFF
=C2=A0 =C2=A0 | =C2=A0 = =C2=A0| =C2=A0 =C2=A0|- Errno::ERANGE
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2= =A0 =C2=A0|- Errno::EREMOTE
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0= |- Errno::EROFS
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ER= PCMISMATCH
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ESHLIBV= ERS
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ESHUTDOWN
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ESOCKTNOSUPPORT
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ESPIPE
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::ESRCH
=C2=A0 =C2=A0 | =C2=A0= =C2=A0| =C2=A0 =C2=A0|- Errno::ESTALE
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| = =C2=A0 =C2=A0|- Errno::ETIME
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2= =A0|- Errno::ETIMEDOUT
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Er= rno::ETOOMANYREFS
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::= ETXTBSY
=C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EUSERS
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0|- Errno::EXDEV
=C2=A0 =C2= =A0 | =C2=A0 =C2=A0| =C2=A0 =C2=A0`- Errno::NOERROR
=C2=A0 =C2=A0 | =C2= =A0 =C2=A0|- ThreadError
=C2=A0 =C2=A0 | =C2=A0 =C2=A0|- TypeError
= =C2=A0 =C2=A0 | =C2=A0 =C2=A0`- ZeroDivisionError
=C2=A0 =C2=A0 |- Syste= mExit
=C2=A0 =C2=A0 | =C2=A0 =C2=A0`- Gem::SystemExitException
=C2=A0= =C2=A0 |- SystemStackError
=C2=A0 =C2=A0 `- fatal

-a

On Tue, Oct 29, 2024 at 8:48=E2=80=AFAM Rodrigo Rosenfeld R= osas via ruby-core <ruby-c= ore@ml.ruby-lang.org> wrote:
Hello, I couldn't find any documentation about the subject, so I th= ought this behavior should be probably documented.

Given= the following code:

def raise_error
=C2=A0 ra= ise "runtime error message"
rescue =3D> e
=C2=A0 "S= tandardError: #{e.message}"
rescue RuntimeError =3D> e
=C2=A0= puts "RuntimeError raised: #{e.message}"
=C2=A0 raise Standar= dError, "standard error message"
end

# same, but the or= der of the rescue blocks are inverted
def raise_error2
=C2=A0 raise &= quot;runtime error message"
rescue RuntimeError =3D> e
=C2=A0= puts "RuntimeError raised: #{e.message}"
=C2=A0 raise Standar= dError, "standard error message"
rescue =3D> e
=C2=A0 &q= uot;StandardError: #{e.message}"
end

p ["raise_error&qu= ot;, raise_error ]

begin
=C2=A0 p ["raise_error2", rais= e_error2]
rescue =3D> e
=C2=A0 puts "raise_error2 raised: #{e= .message}"
end

When we run it, this is the output in Ruby 3.= 3.5:

["rais= e_error", "StandardError: runtime error message"]

=

RuntimeError raised: runtim= e error message

raise_error2 raised: standard err= or message


In the firs= t case (raise_error), the code raised from the RuntimeError rescue block is= rescued by the StandardError block, but when inverting the order of the re= scue blocks (raise_error2) then this won't happen.

Is this part = of the specs? Is this behavior documented somewhere? Could this behavior di= ffer in different Ruby implementations and versions? Or can we rely on such= behavior?


This chapter doesn't include such case in its ex= amples:

https://ruby-doc.com/docs/ProgrammingR= uby/html/tut_exceptions.html

Or this documentation about Excepti= ons:

https://ruby-doc.org/3.3.5/syntax/exceptions_rdoc.htm= l

Is there a recommended way for wrapping exceptions into a part= icular one and then handling that exception from within the same method res= cue blocks? Or is this considered a bad practice?


=C2=A0______________________________________________
=C2=A0ruby-core mailing list -- ruby-core@ml.ruby-lang.org
=C2=A0To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
=C2=A0ruby-core info -- https://m= l.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
=


--
--00000000000012d5bd0625a1753b-- --===============7037771296346547184== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/ --===============7037771296346547184==--