有没有办法使用GRAPE来捕获API中的所有异常,而不是显示HTML错误页面

问题描述 投票:0回答:2

我们使用Grape提供API;由于参数不足,nils等,API会在很多地方随机引发异常。这会导致Rails生成HTML错误页面。有没有办法控制它并包装所有调用以返回错误消息?

我们正在使用

API

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错误消息”

ruby api exception grape
2个回答
1
投票

不知道在哪里注入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

0
投票

我不确定这是否适用于您的设置,但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
© www.soinside.com 2019 - 2024. All rights reserved.