Class Exception and Its Subclasses
Used in begin…end blocks with rescue and in Kernel#raise.
Exception objects carry information about the exception:
- Its type (the class of the exception).
- An optional descriptive message.
- Optional backtrace information.
- Some built-in subclasses of Exception have additional methods: for example,
NameError#name.
Default Exception Classes
Two Ruby statements have default exception classes:
-
raise: Defaults toRuntimeError. -
rescue: Defaults toStandardError.
When an exception has been raised but not yet handled (in rescue, ensure, at_exit, and END blocks), two global variables are set:
-
$!contains the current exception. -
$@contains its backtrace.
#!/usr/bin/ruby
#encoding:UTF-8
x=100
begin
result=x/0
rescue Exception=>err
puts "Error: #{err}"
puts "Current exception: #{$!}"
puts "Backtrace: #{$@}"
ensure
puts "Division operation ended"
end
#!/usr/bin/ruby
#encoding:UTF-8
x=100
begin
result=x/0
rescue StandardError=>err
puts "Error: #{err}"
puts "Current exception: #{$!}"
puts "Backtrace: #{$@}"
ensure
puts "Division operation ended"
end
Output:
Error: divided by 0
Current exception: divided by 0
Backtrace: ["learn4.rb:5:in `/'", "learn4.rb:5:in `<main>'"]
Division operation ended
Custom Exception Classes
To provide additional or alternative information, programs can create custom exception classes derived from built-in exception classes.
#!/usr/bin/ruby
#encoding:UTF-8
class Score
class Error < ::StandardError
def initialize()
@message = "Score value is abnormal"
end
def sayErr()
puts @message
end
end
end
puts "Please enter the score:"
score=gets.chomp.to_i
begin
case score
when 0...60
puts "Fail"
when 61..80
puts "Good"
when 81..99
puts "Excellent"
when 100
puts "Perfect score"
else
raise Score::Error.new
end
rescue Score::Error=>err
err.sayErr()
ensure
puts "Thank you for entering the score"
end
Example execution:
Please enter the score:
1124
Score value is abnormal
Thank you for entering the score
Please enter the score:
99
Excellent
Thank you for entering the score
A good practice is for a library to create a "general" exception class (usually a subclass of StandardError or RuntimeError) and have its other exception classes derive from it. This allows users to rescue the general exception, thereby catching all exceptions the library might raise, even if future versions of the library add new exception subclasses.
Built-in subclasses of Exception include:
NoMemoryError-
ScriptErrorLoadErrorNotImplementedErrorSyntaxError
SecurityError-
SignalExceptionInterrupt
-
StandardError-
ArgumentErrorUncaughtThrowError
EncodingErrorFiberError-
IOErrorEOFError
-
IndexErrorKeyError-
StopIterationClosedQueueError
LocalJumpError-
NameErrorNoMethodError
-
RangeErrorFloatDomainError
RegexpError-
RuntimeErrorFrozenError
-
SystemCallErrorErrno::*
ThreadErrorTypeErrorZeroDivisionError
-
SystemExitSystemStackErrorfatal
Top comments (0)