Ruby klaidas tvarko naudodama begin/rescue/ (Ruby ekvivalentas try/catch/finally). Jūs išimtis ir jas, o naudojama užvalymo operacijoms. Ruby taip pat leidžia metodo lygio rescue (be aiškaus ) dėl švaresnio kodo.
Ruby klaidas tvarko naudodama begin/rescue/ (Ruby ekvivalentas try/catch/finally). Jūs išimtis ir jas, o naudojama užvalymo operacijoms. Ruby taip pat leidžia metodo lygio rescue (be aiškaus ) dėl švaresnio kodo.
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 yra Ruby try/catch/finally. Rescue specifiniai tipai (rescue ArgumentError), naudokite ensure garantuotam užvalymui, ir else atveju, kai nėra klaidų. retry gali pakartoti bloką.
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
Svarbu: paprastas rescue pagauna StandardError (teisingas numatytasis parinkimas programos klaidoms). Gaudymas Exception (šaknis) pagauna viską, įskaitant sisteminių lygio signalus, tokius kaip Interrupt (Ctrl-C) ir SystemExit — kurių paprastai nenorite gaudyti, nes tai gali sutrukdyti programai būti nutrauktai arba tinkamai baigti. Tai dažna Ruby klaida.
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
Tinkama išimčių tvarkyma yra esminė tvirtiems Ruby programoms, ir Ruby požiūrio supratimas — įskaitant jos specifines idiomas ir įspėjimus — yra svarbus.
Structūra begin/rescue/ensure (Ruby try/catch/finally), specifinių išimčių tipų gaudymas, ensure naudojimas garantuotam užvalymu, ir švali metodo lygio rescue (be aiškaus begin) yra pagrindinės kasdienės žinios.
Ypač svarbus ir specifinis Ruby punktas yra StandardError ir Exception skirtumas: paprastas rescue (ir teisingas numatytasis) pagauna StandardError, bet Exception gaudymas (hiearchijos šaknis) pagauna viską — įskaitant sisteminius signalus, tokius kaip Interrupt (Ctrl-C) ir SystemExit — kurių beveik niekada nenorite, nes tai gali sutrukdyti programai būti nutrauktai arba tinkamai baigti, ir tai dažna, žalinga klaida.
Supratimas, kad turėtumėte gaudyti StandardError (ne Exception) programos klaidoms, yra svarbi Ruby specifinė žinia, kuri išvengti realių klaidų.
Žinojimas struktūros, pasitinkamų išimčių klasių (paveldėjimas iš StandardError), retry, metodo lygio rescue idiomo, ir ypač StandardError-not-Exception įspėjimo, yra svarbus tvirtiems, teisungiems Ruby parašymui, kuris tvarkytų klaidas šviesiai, nenutraukdamas programos galimybės būti nutrauktai.
Kadangi neapdorotos klaidos ir Exception-gaudymo klaida abi sukelia realias problemas, Ruby išimčių tvarkymo — jos struktūros, idiomu, ir kritinio StandardError ir Exception skirtumo — išmanymas yra svarbus, dažnai tinkamas žinios patikimam Ruby vystymuii ir dažna pasikalbinimo tema.