Ruby menangani error dengan begin/rescue/ (setara dengan try/catch/finally). Anda exception dan mereka, dengan untuk pembersihan. Ruby juga memungkinkan method-level rescue (tanpa explicit ) untuk kode yang lebih bersih.
Ruby menangani error dengan begin/rescue/ (setara dengan try/catch/finally). Anda exception dan mereka, dengan untuk pembersihan. Ruby juga memungkinkan method-level rescue (tanpa explicit ) untuk kode yang lebih bersih.
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 adalah try/catch/finally Ruby. Rescue tipe spesifik (rescue ArgumentError), gunakan ensure untuk pembersihan yang dijamin, dan else untuk kasus tanpa error. retry dapat mencoba ulang 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: bare rescue menangkap StandardError (default yang benar untuk error aplikasi). Merescue Exception (akar) menangkap segalanya, termasuk sinyal level sistem seperti Interrupt (Ctrl-C) dan SystemExit — yang biasanya Anda tidak ingin tangkap, karena dapat mencegah program diinterupsi atau keluar dengan benar. Kesalahan umum 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 yang tepat adalah esensial untuk aplikasi Ruby yang robust, dan memahami pendekatan Ruby — termasuk idiom spesifiknya dan caveat — adalah penting.
Struktur begin/rescue/ensure (try/catch/finally Ruby), merescue tipe exception spesifik, menggunakan ensure untuk pembersihan yang dijamin, dan method-level rescue yang bersih (tanpa explicit begin) adalah pengetahuan fundamental sehari-hari.
Poin Ruby yang sangat penting dan khas adalah distinsi StandardError vs Exception: bare rescue (dan default yang benar) menangkap StandardError, tetapi merescue Exception (akar hierarki) menangkap segalanya — termasuk sinyal sistem seperti Interrupt (Ctrl-C) dan SystemExit — yang hampir tidak pernah Anda inginkan, karena dapat mencegah program diinterupsi atau keluar dengan benar, dan merupakan kesalahan yang umum dan merugikan.
Memahami bahwa Anda harus rescue StandardError (bukan Exception) untuk error aplikasi adalah pengetahuan spesifik Ruby yang penting yang mencegah bug nyata.
Mengetahui struktur, custom exception class (mewarisi dari StandardError), retry, idiom method-level rescue, dan terutama caveat StandardError-bukan-Exception adalah penting untuk menulis Ruby yang robust dan benar yang menangani error dengan elegan tanpa merusak kemampuan program untuk diinterupsi.
Karena error yang tidak ditangani dan kesalahan merescue Exception keduanya menyebabkan masalah nyata, menguasai exception handling Ruby — strukturnya, idiomnya, dan distinsi kritis StandardError vs Exception — adalah pengetahuan penting dan relevan yang sering untuk pengembangan Ruby yang dapat diandalkan dan topik interview yang umum.