是否应该挽救由于缺少参数而引发的异常?

Should exceptions raised due to missing params be rescued?

是否应该挽救因缺少参数而引发的异常?

例如,在下面的代码中FriendRequestsController

def update
  @request = FriendRequest.find(params[:id])

  if @request.update(friend_request_params)
    flash[:notice] = "Friend request updated successfully."
    redirect_to current_user
  else
    flash[:errors] = @request.errors.full_messages
    redirect_to current_user
  end
end

private
  def friend_request_params
    params.require(:friend_request).permit(:status)
  end

如果对模型的更新调用失败,错误消息将存储在 flash 中。但是,如果 params 出现问题,从而在 friend_request_params 辅助方法中引发异常,应用程序将失败。

约定俗成吗?有更好的方法吗?

简而言之,答案是否定的。当你打电话给

  def friend_request_params
    params.require(:friend_request).permit(:status)
  end

您已经与任何使用 friend_request_params 的动作建立了契约。如果该操作调用 friend_request_params 并且没有发送 :friend_request,则该操作违反了合同并且应该引发异常。您的应用程序确实没有按设计工作,可以这么说,您在煤矿中的金丝雀是个例外。

不,他们不应该。如果您的参数发生异常,那是因为发生了一些奇怪的或意料之外的事情。它可能是一个错误,也可能是有人弄乱了表格。如果 friend_request_params 引发异常,只需向您的用户显示一个漂亮的网页,例如 public/500.html 或 public/400.html.

您可以查看您的日志以跟踪异常,或使用 rescue_from.

实现捕获所有以更方便地记录它们