1
0
Fork 0
mirror of https://github.com/pry/pry.git synced 2022-11-09 12:35:05 -05:00
pry--pry/lib/pry/exceptions.rb
Ryunosuke SATO 74784e8f78 Handle error about frozen object in Ruby 2.2
This kind of error message seems to be updated in Ruby 2.2.

For example, the following code throws an error that has different
error message with Ruby version:
```
"".freeze.instance_eval do
  def hi
  end
end
```

In Ruby 2.1.3:
> RuntimeError: can't modify frozen Class

In Ruby 2.2.0-preview1:
> RuntimeError: can't modify frozen object
2014-10-14 23:07:48 +09:00

78 lines
2.5 KiB
Ruby

class Pry
# As a REPL, we often want to catch any unexpected exceptions that may have
# been raised; however we don't want to go overboard and prevent the user
# from exiting Pry when they want to.
module RescuableException
def self.===(exception)
case exception
# Catch when the user hits ^C (Interrupt < SignalException), and assume
# that they just wanted to stop the in-progress command (just like bash
# etc.)
when Interrupt
true
# Don't catch signals (particularly not SIGTERM) as these are unlikely
# to be intended for pry itself. We should also make sure that
# Kernel#exit works.
when *Pry.config.exception_whitelist
false
# All other exceptions will be caught.
else
true
end
end
end
# Catches SecurityErrors if $SAFE is set
module Pry::TooSafeException
def self.===(exception)
$SAFE > 0 && SecurityError === exception
end
end
# An Exception Tag (cf. Exceptional Ruby) that instructs Pry to show the error
# in a more user-friendly manner. This should be used when the exception
# happens within Pry itself as a direct consequence of the user typing
# something wrong.
#
# This allows us to distinguish between the user typing:
#
# pry(main)> def )
# SyntaxError: unexpected )
#
# pry(main)> method_that_evals("def )")
# SyntaxError: (eval):1: syntax error, unexpected ')'
# from ./a.rb:2 in `eval'
module UserError; end
# When we try to get a binding for an object, we try to define a method on
# that Object's singleton class. This doesn't work for "frozen" Object's, and
# the exception is just a vanilla RuntimeError.
module FrozenObjectException
def self.===(exception)
["can't modify frozen class/module",
"can't modify frozen Class",
"can't modify frozen object",
].include?(exception.message)
end
end
# Don't catch these exceptions
DEFAULT_EXCEPTION_WHITELIST = [SystemExit,
SignalException,
Pry::TooSafeException]
# CommandErrors are caught by the REPL loop and displayed to the user. They
# indicate an exceptional condition that's fatal to the current command.
class CommandError < StandardError; end
class MethodNotFound < CommandError; end
# indicates obsolete API
class ObsoleteError < StandardError; end
# This is to keep from breaking under Rails 3.2 for people who are doing that
# IRB = Pry thing.
module ExtendCommandBundle
end
end