Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành Thạo Ruby Exceptions: Xử Lý Lỗi Với Sự Tự Tin

Một exception là cấu trúc dữ liệu đặc biệt chứa thông tin về điều kiện ngoại lệ xảy ra trong ứng dụng. Exceptions là tín hiệu gửi khi chương trình không thể tiếp tục chạy vì không biết xử lý tình huống cụ thể. Trong Ruby, việc gửi tín hiệu đó gọi là raise exception.

raise 'this is an exception' puts "This message won't be printed."

Cách nhanh nhất thấy exception hoạt động là tự raise nó. Bằng cách dùng method raise với message, Ruby tạo RuntimeError với text truyền vào làm mô tả. Nó cũng thêm stack trace chỉ nơi exception được raise trong code.

$ ruby raise.rb raise.rb:1:in `<main>': this is an exception (RuntimeError) 

Khi chạy script ví dụ, bạn nhận ra, như lời hứa, message không in sau khi exception raise. Đó là vì unhandled exception dừng execution chương trình bằng cách gây crash. Điều này đảm bảo app không tiếp tục chạy sau khi fail hoàn thành task.

Các Loại Exception Khác Nhau

Bên trong, Ruby raise exception khi có sự cố. Ví dụ, bạn nhận exception khi chia số cho 0.

irb(main):001:0> 42/0 ZeroDivisionError: divided by 0 from (irb):1:in `/' from (irb):1 from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>' 

Trong trường hợp này, loại exception là ZeroDivisionError, thay vì RuntimeError trước đó. Có hàng chục loại exception tạo thành hierarchy exception của Ruby, và chúng raise trong tình huống khác nhau.

RuntimeError là exception class generic hơn, nhưng có ví dụ specific hơn. NoMethodError raise khi gọi method không tồn tại, và ArgumentError ghi nhận argument sai truyền cho method hiện có.

Rescue Exception

Hầu hết ứng dụng cần khả năng recover từ exception. Trong web app, lỗi có thể xảy ra khi user submit data sai form. Nên dẫn đến hiển thị error message cho user thay vì crash cả web server.

Trong trường hợp đó, exception có thể raise, nhưng bị rescue bởi web server trước khi đến đỉnh call stack, ngăn exception crash ứng dụng.

begin raise 'this is an exception' rescue RuntimeError => exception puts "Exception rescued: #{exception.inspect}" # => "Exception rescued: #<RuntimeError: this is an exception>" end puts "This message *will* be printed."

Bằng cách wrap ví dụ trước trong begin/rescue block, exception không raise, không crash app. Thay vào đó, rescue-block execute, in message giải thích exception bị chặn. Cũng vì ngăn app crash, message cuối cùng sẽ được in.

Ví dụ này cụ thể rescue từ RuntimeErrors, nên error khác không bị catch. Cụ thể về error được rescue rất tiện, vì cho phép làm điều khác nhau khi error khác nhau xảy ra. Cũng quan trọng đảm bảo không rescue quá nhiều exception.

Để primer sâu hơn về exception handling, và tips rescue exception đúng cách, xem bài exceptions primer trên Ruby Magic.

Có câu hỏi về raise hoặc catch exception trong Ruby? Đừng ngần ngại liên hệ @AppSignal. Chúng tôi rất muốn biết bạn thấy bài này như thế nào, hoặc chủ đề gì bạn muốn biết thêm.