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

Cách sử dụng Từ khóa “Bắt đầu” &“Giải cứu” trong Ruby

Một vấn đề phổ biến trong Ruby là bạn nhận được thông báo lỗi, trong thuật ngữ kỹ thuật chúng tôi gọi là "ngoại lệ".

Những ngoại lệ này có thể được mong đợi , chẳng hạn như một tệp đôi khi có thể có sẵn nhưng bị thiếu trong những tệp khác hoặc một API chỉ khả dụng tạm thời do một số hạn chế hoặc chúng có thể không mong muốn .

Hôm nay, bạn sẽ học cách quản lý các lỗi dự kiến.

Làm thế nào?

Vâng, hãy để tôi giới thiệu với bạn về “bắt đầu” và “giải cứu” trong Ruby, hai từ khóa quan trọng được sử dụng để xử lý các điều kiện lỗi.

Chúng hoạt động như thế nào?

Trước tiên, bạn cần hiểu điều gì đó.

Các chương trình Ruby của bạn có thể gây ra lỗi tại nhiều điểm khi chúng đang chạy.

Ví dụ bao gồm :

  • Đang cố gắng đọc một tệp không tồn tại.
  • Chia một số cho 0.
  • Máy chủ web bạn đang làm việc có chứng chỉ SSL lỗi thời.

Khi có lỗi xảy ra… Ruby không bị lỗi ngay lập tức!

Bạn có cơ hội khôi phục sau lỗi . Chúng tôi gọi đây là “xử lý ngoại lệ”.

Ruby cung cấp cho bạn một số từ khóa để thực hiện khôi phục lỗi trong mã của bạn. Các từ khóa này là begin &rescue .

Hãy khám phá cách sử dụng chúng!

Cách xử lý ngoại lệ Ruby

Bạn xử lý những trường hợp ngoại lệ này như thế nào?

Bạn có thể bọc mã tăng ngoại lệ bằng begin / rescue khối.

Đây là cách nó hoạt động…

Phần đầu tiên (begin ), có mã mà bạn sẽ chạy và điều đó có thể tạo ra một ngoại lệ.

Ví dụ :

begin
  IO.sysopen('/dev/null')
rescue
  # ...
end

Ở đây, chúng tôi đang cố gắng mở một tệp bằng sysopen . Một ngoại lệ được đưa ra nếu chúng tôi không thể mở tệp.

Đây là thời điểm lý tưởng để sử dụng rescue từ khóa!

Sử dụng từ khóa này, bạn có thể nói những gì bạn muốn xảy ra khi một ngoại lệ được nêu ra. Vì vậy, chế độ thất bại nằm trong tầm kiểm soát của bạn.

Ví dụ :

begin
  IO.sysopen('/dev/null')
rescue
  puts "Can't open IO device."
end

Bạn muốn ghi lại lỗi này và có thể cung cấp một số loại giá trị mặc định.

Đừng. Phớt lờ. Lỗi.

Giải cứu nhiều trường hợp ngoại lệ

Bạn cần biết rằng rescue nhận một đối số tùy chọn.

Đối số này là gì?

Đối số này là lớp ngoại lệ mà bạn muốn giải cứu.

Nó phụ thuộc vào mã bạn đang chạy.

Đối với IO :

  • Đây có thể là Errno::ENOENT cho một tệp bị thiếu
  • Hoặc Errno::EACCES vì một lỗi cấp phép

Phần tốt nhất?

Bạn có thể xử lý nhiều trường hợp ngoại lệ trong cùng một khối bắt đầu / giải cứu.

Như thế này :

begin
  IO.sysopen('/dev/null')
rescue Errno::ENOENT
  puts "File not found."
rescue Errno::EACCES
  puts "Insufficient permissions, not allowed to open file."
end

Nếu bạn muốn có cùng một hành động xảy ra cho nhiều trường hợp ngoại lệ…

Bạn có thể làm điều này :

begin
  IO.sysopen('/dev/null')
rescue Errno::ENOENT, Errno::EACCES
  puts "There was an error opening the file."
end

Hãy tiếp tục học hỏi!

Cách giải cứu ngoại lệ bên trong các khối &phương pháp

Không phải lúc nào bạn cũng phải sử dụng begin từ khóa.

Có những trường hợp bạn có thể bỏ qua.

Ở đâu?

Các phương thức &khối bên trong.

Ví dụ :

def get_null_device
  IO.sysopen('/dev/null')
rescue Errno::ENOENT
  puts "Can't open IO device."
end

Bản thân định nghĩa phương thức thực hiện công việc của begin , vì vậy bạn có thể bỏ qua nó.

Bạn cũng có thể làm điều này với các khối.

Ví dụ :

["a.txt", "b.txt", "c.txt"].map do |f|
  IO.sysopen(f)
rescue Errno::ENOENT
  puts "Can't open IO device: #{f}."
end

Bây giờ, có một cách nữa để sử dụng rescue từ khóa không có begin .

Hãy xem cách hoạt động.

Hiểu về Cứu hộ Nội tuyến &Tại sao Nó lại Nguy hiểm

Bạn có thể sử dụng rescue nội tuyến.

Trong một số trường hợp hiếm hoi, bạn có thể thấy hình thức xử lý ngoại lệ này hữu ích.

Đây là một ví dụ :

["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)

Điều này cho phép bạn chỉ mở các tệp tồn tại và bỏ qua những tệp không tồn tại.

Kết quả là bạn nhận được kích thước cho các tệp hiện có.

Không có ngoại lệ nào được nêu ra.

Tại sao làm điều này?

Chà, nó cho phép bạn giữ tất cả mã của mình trong một dòng.

Đó là về nó.

Có một "mối nguy hiểm tiềm ẩn" khi sử dụng hình thức rescue này bởi vì bạn đang nhận được tất cả các ngoại lệ giảm dần từ StandardError .

Đó là hầu hết các trường hợp ngoại lệ.

Tại sao điều đó KHÔNG tốt?

Bởi vì tốt nhất là chỉ xử lý các trường hợp ngoại lệ cụ thể, thay vì nhiều lựa chọn trong số đó.

Điều này giúp tránh việc che giấu lỗi cho chính bạn!

Lỗi ẩn có thể dẫn đến tất cả các loại hành vi kỳ lạ và các vấn đề khó gỡ lỗi.

Tóm tắt

Bạn đã tìm hiểu về các lỗi trong Ruby, cách xử lý ngoại lệ cơ bản và rescue / begin từ khóa.

Hãy chia sẻ bài viết này nếu bạn thấy hữu ích 🙂

Cảm ơn vì đã đọc!