是否应该挽救由于缺少参数而引发的异常?
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
.
实现捕获所有以更方便地记录它们
是否应该挽救因缺少参数而引发的异常?
例如,在下面的代码中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
.