irb
irb copied to clipboard
IRB exits with "undefined method `split' for nil:NilClass (NoMethodError)" on empty #to_s definition in exceptions
Hi,
I just stumbled over an issue where my application raised an exception and due to a corner case in my Rails app, the exception class had an empty #to_s block.
class MyTestException < Exception
def to_s; end
end
When this exception is raised in an IRB session, IRB fails with the following error:
Traceback (most recent call last):
5: from (irb):1
4: from app/lib/pushover_api/message.rb:9:in `push'
3: from app/lib/pushover_api/request.rb:35:in `send'
2: from app/lib/pushover_api/request.rb:54:in `validate_response!'
1: from (byebug):1:in `validate_response!'
Traceback (most recent call last):
30: from bin/rails:4:in `<main>'
29: from /usr/lib64/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `require'
28: from /usr/lib64/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:291:in `load_dependency'
27: from /usr/lib64/ruby/gems/2.5.0/gems/activesupport-6.0.2.1/lib/active_support/dependencies.rb:325:in `block in require'
26: from /usr/lib64/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
25: from /usr/lib64/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
24: from /usr/lib64/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
23: from /usr/lib64/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
22: from /usr/lib64/ruby/gems/2.5.0/gems/bootsnap-1.4.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require'
21: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands.rb:18:in `<top (required)>'
20: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command.rb:46:in `invoke'
19: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/command/base.rb:69:in `perform'
18: from /usr/lib64/ruby/gems/2.5.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
17: from /usr/lib64/ruby/gems/2.5.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
16: from /usr/lib64/ruby/gems/2.5.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
15: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands/console/console_command.rb:102:in `perform'
14: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands/console/console_command.rb:19:in `start'
13: from /usr/lib64/ruby/gems/2.5.0/gems/railties-6.0.2.1/lib/rails/commands/console/console_command.rb:70:in `start'
12: from /usr/lib64/ruby/2.5.0/irb.rb:383:in `start'
11: from /usr/lib64/ruby/2.5.0/irb.rb:427:in `run'
10: from /usr/lib64/ruby/2.5.0/irb.rb:427:in `catch'
9: from /usr/lib64/ruby/2.5.0/irb.rb:428:in `block in run'
8: from /usr/lib64/ruby/2.5.0/irb.rb:487:in `eval_input'
7: from /usr/lib64/ruby/2.5.0/irb/ruby-lex.rb:231:in `each_top_level_statement'
6: from /usr/lib64/ruby/2.5.0/irb/ruby-lex.rb:231:in `catch'
5: from /usr/lib64/ruby/2.5.0/irb/ruby-lex.rb:232:in `block in each_top_level_statement'
4: from /usr/lib64/ruby/2.5.0/irb/ruby-lex.rb:232:in `loop'
3: from /usr/lib64/ruby/2.5.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement'
2: from /usr/lib64/ruby/2.5.0/irb.rb:488:in `block in eval_input'
1: from /usr/lib64/ruby/2.5.0/irb.rb:623:in `signal_status'
/usr/lib64/ruby/2.5.0/irb.rb:530:in `block (2 levels) in eval_input': undefined method `split' for nil:NilClass (NoMethodError)
Well, it's not a blocker for me, I just make sure that the exception returns at least an empty string to bypass this issue.
Hmm, I think this crash is based on a complicated application environment according to the backtrace. I can't reproduce it.
By the way, Ruby 2.5 bundles IRB 0.9.6. It's too old. Could you try to add gem 'irb' to Gemfile of your application and run bundle update? The latest IRB was drastically rewritten.
Fixed in irb-1.10.0 https://github.com/ruby/irb/pull/780
irb(main):001* class MyTestException < Exception
irb(main):002* def to_s; end
irb(main):003* raise self
irb(main):004> end
#<MyTestException: #<MyTestException:0x0000000134336460>>
backtraces are hidden because undefined method `encoding' for nil was raised when processing them
irb(main):005>