mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
80 lines
1.6 KiB
Text
80 lines
1.6 KiB
Text
|
= Exception Handling
|
||
|
|
||
|
Exceptions are rescued in a +begin+/+end+ block:
|
||
|
|
||
|
begin
|
||
|
# code that might raise
|
||
|
rescue
|
||
|
# handle exception
|
||
|
end
|
||
|
|
||
|
If you are inside a method you do not need to use +begin+ or +end+ unless you
|
||
|
wish to limit the scope of rescued exceptions:
|
||
|
|
||
|
def my_method
|
||
|
# ...
|
||
|
rescue
|
||
|
# ...
|
||
|
end
|
||
|
|
||
|
The same is true for a +class+ or +module+.
|
||
|
|
||
|
You can assign the exception to a local variable by using <tt>=>
|
||
|
variable_name</tt> at the end of the +rescue+ line:
|
||
|
|
||
|
begin
|
||
|
# ...
|
||
|
rescue => exception
|
||
|
warn exception.message
|
||
|
raise # re-raise the current exception
|
||
|
end
|
||
|
|
||
|
By default StandardError and its subclasses are rescued. You can rescue a
|
||
|
specific set of exception classes (and their subclasses) by listing them after
|
||
|
+rescue+:
|
||
|
|
||
|
begin
|
||
|
# ...
|
||
|
rescue ArgumentError, NameError
|
||
|
# handle ArgumentError or NameError
|
||
|
end
|
||
|
|
||
|
You may rescue different types of exceptions in different ways:
|
||
|
|
||
|
begin
|
||
|
# ...
|
||
|
rescue ArgumentError
|
||
|
# handle ArgumentError
|
||
|
rescue NameError
|
||
|
# handle NameError
|
||
|
rescue
|
||
|
# handle any StandardError
|
||
|
end
|
||
|
|
||
|
The exception is matched to the rescue section starting at the top, and matches
|
||
|
only once. If an ArgumentError is raised in the begin section it will not be
|
||
|
handled in the StandardError section.
|
||
|
|
||
|
To always run some code whether an exception was raised or not, use +ensure+:
|
||
|
|
||
|
begin
|
||
|
# ...
|
||
|
rescue
|
||
|
# ...
|
||
|
ensure
|
||
|
# this always runs
|
||
|
end
|
||
|
|
||
|
You may also run some code when an exception is not raised:
|
||
|
|
||
|
begin
|
||
|
# ...
|
||
|
rescue
|
||
|
# ...
|
||
|
else
|
||
|
# this runs only when no exception was raised
|
||
|
ensure
|
||
|
# ...
|
||
|
end
|
||
|
|