Ruby mengendalikan ralat dengan begin// (setara Ruby kepada try/catch/finally). Anda pengecualian dan ia, dengan untuk pembersihan. Ruby juga membenarkan rescue pada peringkat kaedah (tanpa eksplisit) untuk kod yang lebih bersih.
Ruby mengendalikan ralat dengan begin// (setara Ruby kepada try/catch/finally). Anda pengecualian dan ia, dengan untuk pembersihan. Ruby juga membenarkan rescue pada peringkat kaedah (tanpa eksplisit) untuk kod yang lebih bersih.
rescueensureraiserescueensurebeginbegin
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 adalah try/catch/finally Ruby. Rescue jenis tertentu (rescue ArgumentError), gunakan ensure untuk pembersihan terjamin, dan else untuk kes tiada-ralat. retry boleh mencuba semula 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
Penting: rescue tanpa argumen menangkap StandardError (lalai yang betul untuk ralat aplikasi). Me-rescue Exception (akar) menangkap segala-galanya, termasuk isyarat peringkat sistem seperti Interrupt (Ctrl-C) dan SystemExit — yang biasanya anda tidak mahu tangkap, kerana ia boleh menghalang program daripada diganggu atau keluar dengan betul. Satu kesilapan Ruby yang lazim.
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
Pengendalian pengecualian yang betul adalah penting untuk aplikasi Ruby yang teguh, dan memahami pendekatan Ruby — termasuk idiom dan amarannya yang khusus — adalah penting.
Struktur begin/rescue/ensure (try/catch/finally Ruby), me-rescue jenis pengecualian tertentu, menggunakan ensure untuk pembersihan terjamin, dan rescue peringkat kaedah yang bersih (tanpa begin eksplisit) adalah pengetahuan asas harian.
Satu perkara yang amat penting dan tersendiri Ruby ialah perbezaan StandardError lawan Exception: rescue tanpa argumen (dan lalai yang betul) menangkap StandardError, tetapi me-rescue Exception (akar hierarki) menangkap segala-galanya — termasuk isyarat sistem seperti Interrupt (Ctrl-C) dan SystemExit — yang hampir tidak pernah anda mahukan, kerana ia boleh menghalang program daripada diganggu atau keluar dengan betul, dan merupakan kesilapan yang lazim dan berbahaya.
Memahami bahawa anda harus me-rescue StandardError (bukan Exception) untuk ralat aplikasi adalah pengetahuan khusus Ruby yang penting yang mencegah pepijat sebenar.
Mengetahui struktur, kelas pengecualian tersuai (mewarisi daripada StandardError), retry, idiom rescue peringkat kaedah, dan terutamanya amaran StandardError-bukan-Exception adalah penting untuk menulis Ruby yang teguh dan betul yang mengendalikan ralat dengan baik tanpa merosakkan keupayaan program untuk diganggu.
Memandangkan ralat yang tidak dikendalikan dan kesilapan me-rescue Exception kedua-duanya menyebabkan masalah sebenar, menguasai pengendalian pengecualian Ruby — strukturnya, idiomnya, dan perbezaan kritikal StandardError lawan Exception — adalah pengetahuan penting yang kerap relevan untuk pembangunan Ruby yang boleh dipercayai dan topik temu duga yang lazim.