This is a question regarding Begin-Rescue-Ensure handling exception to Ruby

Asked 2 years ago, Updated 2 years ago, 104 views

Is ensure in Ruby = finally the same in C#?

I don't know exactly when sense will run, so I don't know when to close the file.

file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end
file = File.open("myFile.txt", "w")

begin
  file << "#{content} \n"
  file.close
rescue
  #handle the error here
ensure
  file.close unless file.nil?
end

ruby exception-handling

2022-09-22 15:53

1 Answers

sense literally means "guarantees that the code will always be valued." It's the same as Java/C#'s finally.

Usually, the flow of exception handling begin-resue-else-sense-end flows like this

begin
  # code that may or may not be exception
rescue SomeExceptionClass => some_variable
  # Code that handles what excpetion
rescue SomeOtherException => some_other_variable
  # Code that handles another excpetion
else
  # Code to run if exception is not raised
ensure
  # Code to be executed unconditionally with or without exception
end

In the flow above, resue, ense, and else are not required, and are written optionally if necessary.

The => var part is not necessarily required in resue, but if left blank, it will be difficult to determine exactly what exceptions have occurred.

If exception class is not specified in rescue, all exceptions that inherit StandardError will be filtered (SystemStackError that does not inherit StandardError, etc. will be excluded

In ruby, certain blocks are also exception blocks. For example, defining a method is also an exception block. Code 1 below can be replaced by Code 2 and Code 3.

Code 1

def foo
  begin
    # ...
  rescue
    # ...
  end
end

Code 2

def foo
  # ...
rescue
  # ...
end

Code 3

def foo
  # ...
ensure
  # ...
end

(Same class/module definition)


2022-09-22 15:53

If you have any answers or tips


© 2024 OneMinuteCode. All rights reserved.