ruby lap-trinh til - It costs 2 mins to read

Hai ngày cuối tuần vừa qua, mình được tham dự khóa Android Advanced do GDG Việt Nam tổ chức. Thành quả thu lượm được từ sự kiện này là một cái áo thun (Size M mặc không vừa, cũng không ưng vì phía lưng có chữ FPT Software), một balo túi rút + 2 bữa trưa ăn Pizza miễn phí, haha. Đùa thôi, cái mình thấy tâm đắc nhất sau khóa học không phải là những kinh nghiệm cũng như kiến thức nâng cao về Android (như Necessarily Android tools & library, LifeCycle, Android Performance Patterns, Memory Leak, CPU, GPU Problems Detection, Eco-system của Firebase, bởi vì mình không biết là có nên switch từ một Web Developer sang Android Developer không nữa), càng không phải là mấy món quà tặng kể trên. Mà là mình biết được thêm về bản thân mình (mình giao tiếp kém quá và kiến thức nền còn hỏng nhiều chỗ) và mình cũng được biết thêm về những người trẻ tuổi và giỏi giang khác nữa (2 trainer của khóa học này - một bạn mới 23 tuổi nhưng đã là senior android developer tại Lazada và Google Expert - cùng một số học viên học hỏi tích cực và đầy kinh nghiệm nữa). Quan trọng là mình biết được mình cần phải lên kế hoạch tập trung vào những gì có thể giúp mình trở thành một senior developer.


Lan man nãy giờ đủ rồi, Quay lại chủ đề chính của bài #til hôm nay: Rescue Standard Error NOT Exception - Một thói quen xấu của Lập trình viên Ruby, đặc biệt là junior (và mình cũng là một trong số họ) đó là hay rescue exception như sau

begin
  # something
rescue Exception => e
  # notice error
end

Class Exception trong Ruby có rất nhiều sub class, trong đó có nhiều class mà mình nghĩ là App không cần phải handle (xem danh sách tại đây). Vậy nên, một cách tốt hơn là chỉ rescue StandardError

Better

begin
  # something
rescue => e
  # notice Standard Error
end

là cách viết ngắn gọn của

begin
  # something
rescue StandardError => e
  # notice Standard Error
end

Nhưng tốt nhất là cụ thể hóa loại Exception mà bạn muốn app handle

Best

HTTP_ERRORS = [
  EOFError,
  Errno::ECONNRESET,
  Errno::EINVAL,
  Net::HTTPBadResponse,
  Net::HTTPHeaderSyntaxError,
  Net::ProtocolError,
  Timeout::Error
]

begin
  some.http.call
rescue *HTTP_ERRORS => error
  notify_airbrake(error)
end


Mình đọc được practice này trên Best Ruby.