Skip to content

fix: handle broken pipe gracefully instead of panicking#32946

Open
bartlomieju wants to merge 1 commit intodenoland:mainfrom
bartlomieju:fix/broken-pipe-panic
Open

fix: handle broken pipe gracefully instead of panicking#32946
bartlomieju wants to merge 1 commit intodenoland:mainfrom
bartlomieju:fix/broken-pipe-panic

Conversation

@bartlomieju
Copy link
Copy Markdown
Member

@bartlomieju bartlomieju commented Mar 24, 2026

Summary

When stdout is piped to a command that exits early (e.g. deno info | head,
deno test | jq), println! panics from Rust's stdio module, producing a
scary "Deno has panicked" message.

This adds a check in the existing panic hook that detects panics originating
from Rust's io/stdio.rs module and exits silently with code 141
(128 + SIGPIPE) on Unix or 1 on Windows, matching standard Unix CLI behavior.

This covers all 68+ println! callsites in the CLI without needing to:

  • Modify each callsite individually to use a helper function
  • Toggle SIGPIPE signal handlers globally or per-subcommand

Supersedes #28383
Closes #28338
Closes #25258
Closes #24529
Closes #15767
Closes #15045

Test plan

Tested all reported scenarios on macOS:

$ ./target/debug/deno info | echo    # was: panic, now: silent exit
$ ./target/debug/deno info | true    # was: panic, now: silent exit
$ ./target/debug/deno info | head -1 # was: panic, now: silent exit

🤖 Generated with Claude Code

When stdout is piped to a command that exits early (e.g. `deno info | head`),
println! panics from Rust's stdio module. Instead of showing a scary "Deno has
panicked" message, detect this via the panic location and exit silently with
code 141 (128 + SIGPIPE) on Unix or 1 on Windows.

This covers all 68+ println! callsites in the CLI without needing to modify
each one individually or toggle SIGPIPE signal handlers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant