Ruby hushughulikia errors kwa begin/rescue/ (sawa na Ruby ya try/catch/finally). Una exceptions na zao, ikiwa na kwa cleanup. Ruby pia inaruhusu method-level rescue (bila ya wazi) kwa msimbo safi zaidi.
Ruby hushughulikia errors kwa begin/rescue/ (sawa na Ruby ya try/catch/finally). Una exceptions na zao, ikiwa na kwa cleanup. Ruby pia inaruhusu method-level rescue (bila ya wazi) kwa msimbo safi zaidi.
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue a SPECIFIC exception type
puts "Bad argument: #{e.message}"
rescue StandardError => e # broader catch (StandardError, not Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry can re-run the begin block
else
puts "succeeded" # runs if NO exception
ensure
cleanup # ALWAYS runs (success or failure)
end
begin/rescue/ensure ni try/catch/finally ya Ruby. Rescue types mahususi (rescue ArgumentError), tumia ensure kwa cleanup iliyohakikishwa, na else kwa hali ya no-error. retry inaweza kujaribu tena block.
rescue => e # ✅ bare rescue catches StandardError (the right default)
rescue StandardError # ✅ explicit, same thing
rescue Exception # ❌ AVOID — catches EVERYTHING including system signals
# (Interrupt/Ctrl-C, SystemExit) — can break the program
Muhimu: bare rescue hukamata StandardError (default sahihi kwa errors za application). Kufanya rescue Exception (root) hukamata kila kitu, ikiwa ni pamoja na system-level signals kama Interrupt (Ctrl-C) na SystemExit — ambazo kwa kawaida hutaki kukamata, kwani inaweza kuzuia programu kuingiliwa au kutoka ipasavyo. Kosa la kawaida la Ruby.
raise ArgumentError, "Amount must be positive" # raise a built-in
raise "Something failed" # raises RuntimeError
# custom exception class
class InsufficientFundsError < StandardError # inherit from StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue WITHOUT begin — applies to the whole method body
handle(e)
ensure
cleanup
end
Exception handling ifaayo ni muhimu kwa programu imara za Ruby, na kuelewa mbinu ya Ruby — ikiwa ni pamoja na idioms na caveats zake mahususi — ni muhimu.
Muundo wa begin/rescue/ensure (try/catch/finally ya Ruby), kufanya rescue types mahususi za exception, kutumia ensure kwa cleanup iliyohakikishwa, na method-level rescue safi (bila begin ya wazi) ni maarifa ya msingi ya kila siku.
Hoja muhimu hasa na ya kipekee ya Ruby ni tofauti ya StandardError dhidi ya Exception: bare rescue (na default sahihi) hukamata StandardError, lakini kufanya rescue Exception (root ya hierarchy) hukamata kila kitu — ikiwa ni pamoja na system signals kama Interrupt (Ctrl-C) na SystemExit — ambayo karibu kamwe hutaki, kwani inaweza kuzuia programu kuingiliwa au kutoka ipasavyo, na ni kosa la kawaida, lenye madhara.
Kuelewa kwamba unapaswa kufanya rescue StandardError (si Exception) kwa errors za application ni maarifa muhimu ya kipekee ya Ruby yanayozuia bugs halisi.
Kujua muundo, custom exception classes (zinazorithi kutoka StandardError), retry, idiom ya method-level rescue, na hasa caveat ya StandardError-si-Exception ni muhimu kwa kuandika Ruby imara, sahihi inayoshughulikia errors kwa busara bila kuvunja uwezo wa programu kuingiliwa.
Kwa kuwa errors zisizoshughulikiwa na kosa la kufanya rescue Exception vyote husababisha matatizo halisi, kuimudu exception handling ya Ruby — muundo wake, idioms, na tofauti muhimu ya StandardError dhidi ya Exception — ni maarifa muhimu, yanayofaa mara kwa mara kwa uendelezaji wa Ruby unaotegemewa na mada ya mahojiano ya kawaida.