Computer >> Máy Tính >  >> Lập trình >> Ruby

Ngoại lệ trong Ruby

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

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

Cách nhanh nhất để thấy một ngoại lệ đang hoạt động là tự mình nêu ra một ngoại lệ. Bằng cách sử dụng raise với một thông báo, Ruby sẽ tạo một RuntimeError với văn bản được thông qua như mô tả của nó. Nó cũng sẽ thêm một dấu vết ngăn xếp trỏ đến nơi đặt ngoại lệ từ trong mã của bạn.

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

Khi chạy đoạn mã ví dụ ở trên, bạn sẽ nhận thấy rằng, như đã hứa, thông báo không được in sau khi ngoại lệ được nêu ra. Đó là bởi vì các ngoại lệ không được xử lý sẽ tạm dừng thực thi chương trình của bạn bằng cách gây ra sự cố. Điều này nhằm đảm bảo ứng dụng của bạn không tiếp tục chạy sau khi không hoàn thành một trong các tác vụ của nó.

Các loại ngoại lệ khác nhau

Về mặt nội bộ, Ruby đưa ra các ngoại lệ khi mọi thứ diễn ra không như ý muốn. Ví dụ:bạn sẽ gặp một ngoại lệ khi cố gắng chia một số bằng 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, kiểu của ngoại lệ là ZeroDivisionError , thay vì RuntimeError chúng ta đã thấy trước đây. Có hàng tá loại ngoại lệ để tạo thành hệ thống phân cấp ngoại lệ của Ruby và tất cả chúng đều được đưa ra trong các tình huống khác nhau.

RuntimeError là một lớp ngoại lệ chung chung hơn, nhưng có nhiều ví dụ cụ thể hơn. A NoMethodError nổi lên khi cố gắng gọi một phương thức không tồn tại và ArgumentError lưu ý rằng các đối số sai được chuyển cho một phương thức hiện có chẳng hạn.

Giải cứu ngoại lệ

Hầu hết các ứng dụng yêu cầu khả năng khôi phục từ các trường hợp ngoại lệ. Trong ứng dụng web, lỗi có thể xảy ra khi người dùng gửi dữ liệu bị lỗi trong biểu mẫu. Điều này sẽ dẫn đến thông báo lỗi được hiển thị cho người dùng thay vì làm hỏng toàn bộ máy chủ web.

Trong trường hợp như vậy, một ngoại lệ có thể tăng lên, nhưng nó sẽ được máy chủ web giải cứu trước khi đạt đến đầu ngăn xếp cuộc gọi, điều này ngăn ngoại lệ làm hỏng ứ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 bao bọc ví dụ từ trước trong một khối bắt đầu / giải cứu, ngoại lệ sẽ không được nâng lên và nó sẽ không làm ứng dụng của chúng tôi bị hỏng. Thay vào đó, khối giải cứu được thực thi, nó in ra một thông báo giải thích ngoại lệ đã bị cản trở, trong trường hợp này. Ngoài ra, vì điều này ngăn ứng dụng của chúng tôi gặp sự cố, thông báo cuối cùng sẽ được in.

Ví dụ này đặc biệt giải cứu khỏi RuntimeError s, vì vậy bất kỳ lỗi nào khác sẽ không bị bắt. Nói cụ thể về những lỗi nào được giải quyết rất tiện lợi, vì nó sẽ cho phép bạn làm những việc khác nhau khi các lỗi khác nhau xảy ra. Ngoài ra, điều quan trọng là đảm bảo không giải cứu quá nhiều trường hợp ngoại lệ.

Để có kiến ​​thức chuyên sâu hơn về cách xử lý ngoại lệ và một số mẹo về cách giải cứu các ngoại lệ đúng cách, hãy xem sơ lược ngoại lệ của chúng tôi trên Ruby Magic.

Bạn có bất kỳ câu hỏi nào về việc nâng cao hoặc bắt các ngoại lệ trong Ruby? Vui lòng cho chúng tôi biết tại @AppSignal. Tất nhiên, chúng tôi muốn biết bạn thích bài viết này như thế nào hoặc nếu bạn có chủ đề khác mà bạn muốn biết thêm.