CARVIEW |
Select Language
HTTP/2 200
x-amz-id-2: ipmd3REx1Bho1yYY+NhBS3tEigYinpi0WXLY/HzKXumEZje+AjGZM9dSV7wrETuY+to0USBlRv2qYCchsVwMpR52FJFUcsOxvLuYXg5QHUg=
x-amz-request-id: ASYZCC36C3P6D1VS
last-modified: Thu, 22 May 2025 09:41:19 GMT
etag: "bc1c774996ac7dca1001c9bbe1841dca"
x-amz-server-side-encryption: AES256
server: AmazonS3
content-encoding: gzip
via: 1.1 varnish, 1.1 varnish
content-type: text/plain; charset=utf-8
accept-ranges: bytes
age: 0
date: Wed, 23 Jul 2025 20:46:02 GMT
x-served-by: cache-tyo11962-TYO, cache-bom-vanm7210089-BOM
x-cache: MISS, MISS
x-cache-hits: 0, 0
x-timer: S1753303563.525335,VS0,VE395
vary: Accept-Encoding
content-length: 1027
From: "ioquatix (Samuel Williams) via ruby-core"
Date: 2025-05-22T09:39:10+00:00
Subject: [ruby-core:122229] [Ruby Bug#21360] Inconsistent Support for `Exception#cause` in `Fiber#raise` and `Thread#raise`
Issue #21360 has been reported by ioquatix (Samuel Williams).
----------------------------------------
Bug #21360: Inconsistent Support for `Exception#cause` in `Fiber#raise` and `Thread#raise`
https://bugs.ruby-lang.org/issues/21360
* Author: ioquatix (Samuel Williams)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
The `raise` method supports setting the cause of an exception using the `cause:` keyword, but this behavior does not work as expected when calling `Fiber#raise` or `Thread#raise`, resulting in a `TypeError`. This breaks consistency with `Kernel#raise` and makes it difficult to attach causal chains to exceptions raised from other execution contexts.
## The Problem
The following code behaves correctly when using `Kernel#raise`, correctly setting the `cause`:
```ruby
cause = RuntimeError.new("cause")
begin
raise RuntimeError, "boom", cause: cause
rescue => error
pp error: error, cause: error.cause
end
```
Produces:
```ruby
{error: #, cause: #}
```
However, using `Fiber.current.raise` or `Thread.current.raise` with the same arguments produces a `TypeError`:
```ruby
begin
Fiber.current.raise RuntimeError, "boom", cause: cause
rescue => error
pp error: error, cause: error.cause
end
```
Results in:
```ruby
{error: #, cause: nil}
```
This occurs because the third argument is incorrectly interpreted as a backtrace, not as keyword arguments. A similar issue occurs with `Thread#raise`.
## Proposed Solution
Update `Fiber#raise` and `Thread#raise` to accept and correctly interpret keyword arguments, including `cause:`, in the same manner as `Kernel#raise`. This would restore consistency across all `raise` implementations and allow causal exception chaining regardless of context.
--
https://bugs.ruby-lang.org/
______________________________________________
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/