冒险村12 - rescue exception

12 - rescue exception

异常处理在开发过程中时常可见,举例来说 Rails 中找不到对应的 routing 的时候则会丢出 Routing Error,或者是在特定的程序码中手动加入 raise 来丢出 Exception

  # 验证 params[:user]
  def validate_user
    if user.blank?
      raise "User is #{I18n.t('errors.messages.blank')}"
    end
  end

raise 起来後,我们可以透过 rescue 来处理 exception,并记录於 logger 或者是通知第三方(Bugsnag)串接 slack 提醒都是可行的做法。

  def valid?
    validate_user
    validate_email
    validate_device

    true
  rescue => e
    Bugsnag.notify e
    false
  end

注: 内建的 Error 有太多种类,详情可以直接参考文件 https://ruby-doc.org/core-2.2.0/Exception.html

rescue 後也可以接对应的 Error 来做对应的事情。

  class ApiService
    def initialize(url)
      @url = url

      get_some_api_reponses
    rescue Net::ReadTimeout => e
      Bugsnag.notify(e)
    end

    def get_some_api_reponses
      # ...
    end
  end

通常 rescue 一开始写的时候可能不常直接想到需要在什麽情况加入,对应的 Error 也写的不清不楚,直接 e 全部 rescue 起来。不过从串接第三方喷出 exception 的通知後,再回来思考像是 api runtime 时间过长、import csv 需要 retry 的加入等等情况下,不只纪录 log,还有能将喷错时做对应的措施也是重要的一环。

rescue 相似的还有用在 controller 的 rescue_from 例外处理,通常我们在 user show 页面很常会透过 params id 来找 user,但如果没有 id 时,就会跑出 ActiveRecord::RecordNotFound 的错误。

  @user = User.find(params[:id])

这时,我们可以在 Controller 内加上 rescue_from 来处理,也可以写成 block 的两种方式。

  # (1)
  class UserController < ActionController::Base
    rescue_from ActiveRecord::RecordNotFound, with: :notify_record_not_found

    #...

    private

    def notify_record_not_found
      e = "User id:#{params[:id]} not found."
      Bugsnag.notify(e)
    end
  end

  # (2)
  class UserController < ActionController::Base
    rescue_from ActiveRecord::RecordNotFound, with: :notify_record_not_found do |_exception|
      e = "User id:#{params[:id]} not found."
      Bugsnag.notify(e)
    end

    #...
  end

My blog


<<:  GCP loadbalanc(二)

>>:  如何在 WordPress 设定 Google reCAPTCHA 保护(登入、留言、联络)表单,免遭恶意攻击

特徵萃取 | ML#Day8

需要发展「特徵工程」的另一个入门大问题,是没有想过会需要做特徵提取的工作,也就是从参数里面得到新的参...

预编译:函数声明 vs 函数表达式

function 预编译:函数声明 vs 函数表达式 fun1(); //1 fun2(); //U...

Day04-CRUD API 实作(四)Model、Migration

大家好~ 今天要开始实作留言功能, 个人习惯先从建立 Model 开始, 在建立 Model 时, ...

Day08 永丰金API 建立订单交易

终於要进入成立订单的部份了,先看一下成立订单所需要的参数, { "ShopNo"...

图的资料结构

3 图的资料结构 今天来介绍我们储存一张图的时候,几种常见的资料结构:相邻矩阵(Adjacency ...