我们使用Grape提供API;由于参数不足,nils等,API会在很多地方随机引发异常。这会导致Rails生成HTML错误页面。有没有办法控制它并包装所有调用以返回错误消息?
我们正在使用
gem 'grape', '0.9'
gem 'grape-swagger', '0.8.0'
gem 'grape-swagger-rails'
例如:如果API中发生任何错误,则无法访问
rescue ArgumentError => ex
error! ex.message
rescue Mongoid::Errors::Validations => ex
error! ex.message
API方法我们需要一种方法来捕获绕过HTML错误页面的确切错误消息。
已经尝试过了
https://code.dblock.org/2011/05/04/grape-trapping-all-exceptions-within-the-api.html
不知道在哪里注入ApiErrorHandler。
预期结果应该是“结果:xyz错误消息”
不知道在哪里注入ApiErrorHandler
在你的Grape控制器中:
require 'api_error_handler'
class Api_v1 < Grape::API
prefix 'api'
version 'v1'
use ApiErrorHandler
...
end
您链接的article
的代码示例
或者您可以在辅助方法中捕获异常。就像是:
module ActionsHelper
extend Grape::API::Helpers
def request_with_error_handling(options = { status: 422 }, &block)
raise ArgumentError, 'Options are nil' if options.nil?
raise ArgumentError, 'No block given' unless block_given?
yield
rescue Mongoid::Errors::Validations => ex
error! ex.message
rescue ArgumentError => ex
error! ex.message
end
end
# users as an example
class Users < Grape::API
namespace :users do
helpers ActionsHelper
desc 'Create new user'
params do
# user params
end
post '/' do
request_with_error_handling do
# your user creation logic here
# any exception would be catched
# in request_with_error_handling helper method
end
end
end
end
我不确定这是否适用于您的设置,但Grape已经建立了做这种事情的方法。从文档:
class Twitter::API < Grape::API
rescue_from ArgumentError do |e|
Rack::Response.new([ "ArgumentError: #{e.message}" ], 500).finish
end
rescue_from NotImplementedError do |e|
Rack::Response.new([ "NotImplementedError: #{e.message}" ], 500).finish
end
end