如何在 API 调用中呈现完整的 Ruby on Rails 错误?

How to render complete Ruby on Rails errors on an API call?

提问人:gordie 提问时间:11/11/2022 最后编辑:gordie 更新时间:11/11/2022 访问量:123

问:

我构建了一个 Ruby on Rails 应用程序,我可以调用端点来获取一些 API 响应。

我通常像这样渲染数据和错误:

def my_fn
  begin
    #...computing data...
    response = {
        #...my data here...
    }

    #...returning OK response...
    render status: 200, json: response

    #...handling errors...
  rescue StandardError => e
    render status: 400, json: { message: e.to_s }
  end
end

它返回我的结果如下

{
    "message": "My custom error message"
}

但是当我的应用程序真的崩溃时,我会得到更详细的响应,比如

{
    "status": 500,
    "error": "Internal Server Error",
    "exception": "#<NameError: undefined local variable or method `aa' for #<WpsstmController:0x00000000027e98>>",
    "traces": {
        "Application Trace": [
            {
                "exception_object_id": 81760,
                "id": 0,
                "trace": "app/controllers/wpsstm_controller.rb:48:in `get_tracklist'"
            }
        ],
        "Framework Trace": [
            {
                "exception_object_id": 81760,
                "id": 1,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 2,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/base.rb:228:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 3,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/rendering.rb:30:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 4,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/callbacks.rb:42:in `block in process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 5,
                "trace": "activesupport (6.1.4.7) lib/active_support/callbacks.rb:106:in `run_callbacks'"
            },
            {
                "exception_object_id": 81760,
                "id": 6,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/callbacks.rb:41:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 7,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/rescue.rb:22:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 8,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 9,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications.rb:203:in `block in instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 10,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications/instrumenter.rb:24:in `instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 11,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications.rb:203:in `instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 12,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/instrumentation.rb:33:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 13,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 14,
                "trace": "activerecord (6.1.4.7) lib/active_record/railties/controller_runtime.rb:27:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 15,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/base.rb:165:in `process'"
            },
            {
                "exception_object_id": 81760,
                "id": 16,
                "trace": "actionview (6.1.4.7) lib/action_view/rendering.rb:39:in `process'"
            },
            {
                "exception_object_id": 81760,
                "id": 17,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal.rb:190:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 18,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal.rb:254:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 19,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 20,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:33:in `serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 21,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:50:in `block in serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 22,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:32:in `each'"
            },
            {
                "exception_object_id": 81760,
                "id": 23,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:32:in `serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 24,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:842:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 25,
                "trace": "rack (2.2.4) lib/rack/etag.rb:27:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 26,
                "trace": "rack (2.2.4) lib/rack/conditional_get.rb:40:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 27,
                "trace": "rack (2.2.4) lib/rack/head.rb:12:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 28,
                "trace": "activerecord (6.1.4.7) lib/active_record/migration.rb:601:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 29,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'"
            },
            {
                "exception_object_id": 81760,
                "id": 30,
                "trace": "activesupport (6.1.4.7) lib/active_support/callbacks.rb:98:in `run_callbacks'"
            },
            {
                "exception_object_id": 81760,
                "id": 31,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/callbacks.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 32,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/executor.rb:14:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 33,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 34,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 35,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 36,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:37:in `call_app'"
            },
            {
                "exception_object_id": 81760,
                "id": 37,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:26:in `block in call'"
            },
            {
                "exception_object_id": 81760,
                "id": 38,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:99:in `block in tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 39,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:37:in `tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 40,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:99:in `tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 41,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 42,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 43,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/request_id.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 44,
                "trace": "rack (2.2.4) lib/rack/runtime.rb:22:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 45,
                "trace": "activesupport (6.1.4.7) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 46,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/executor.rb:14:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 47,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/static.rb:24:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 48,
                "trace": "rack (2.2.4) lib/rack/sendfile.rb:110:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 49,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/host_authorization.rb:119:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 50,
                "trace": "rack-cors (1.1.1) lib/rack/cors.rb:100:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 51,
                "trace": "railties (6.1.4.7) lib/rails/engine.rb:539:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 52,
                "trace": "puma (4.3.12) lib/puma/configuration.rb:228:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 53,
                "trace": "puma (4.3.12) lib/puma/server.rb:727:in `handle_request'"
            },
            {
                "exception_object_id": 81760,
                "id": 54,
                "trace": "puma (4.3.12) lib/puma/server.rb:476:in `process_client'"
            },
            {
                "exception_object_id": 81760,
                "id": 55,
                "trace": "puma (4.3.12) lib/puma/server.rb:332:in `block in run'"
            },
            {
                "exception_object_id": 81760,
                "id": 56,
                "trace": "puma (4.3.12) lib/puma/thread_pool.rb:134:in `block in spawn_thread'"
            }
        ],
        "Full Trace": [
            {
                "exception_object_id": 81760,
                "id": 0,
                "trace": "app/controllers/wpsstm_controller.rb:48:in `get_tracklist'"
            },
            {
                "exception_object_id": 81760,
                "id": 1,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 2,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/base.rb:228:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 3,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/rendering.rb:30:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 4,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/callbacks.rb:42:in `block in process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 5,
                "trace": "activesupport (6.1.4.7) lib/active_support/callbacks.rb:106:in `run_callbacks'"
            },
            {
                "exception_object_id": 81760,
                "id": 6,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/callbacks.rb:41:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 7,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/rescue.rb:22:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 8,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 9,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications.rb:203:in `block in instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 10,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications/instrumenter.rb:24:in `instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 11,
                "trace": "activesupport (6.1.4.7) lib/active_support/notifications.rb:203:in `instrument'"
            },
            {
                "exception_object_id": 81760,
                "id": 12,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/instrumentation.rb:33:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 13,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 14,
                "trace": "activerecord (6.1.4.7) lib/active_record/railties/controller_runtime.rb:27:in `process_action'"
            },
            {
                "exception_object_id": 81760,
                "id": 15,
                "trace": "actionpack (6.1.4.7) lib/abstract_controller/base.rb:165:in `process'"
            },
            {
                "exception_object_id": 81760,
                "id": 16,
                "trace": "actionview (6.1.4.7) lib/action_view/rendering.rb:39:in `process'"
            },
            {
                "exception_object_id": 81760,
                "id": 17,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal.rb:190:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 18,
                "trace": "actionpack (6.1.4.7) lib/action_controller/metal.rb:254:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 19,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'"
            },
            {
                "exception_object_id": 81760,
                "id": 20,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:33:in `serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 21,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:50:in `block in serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 22,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:32:in `each'"
            },
            {
                "exception_object_id": 81760,
                "id": 23,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/journey/router.rb:32:in `serve'"
            },
            {
                "exception_object_id": 81760,
                "id": 24,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/routing/route_set.rb:842:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 25,
                "trace": "rack (2.2.4) lib/rack/etag.rb:27:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 26,
                "trace": "rack (2.2.4) lib/rack/conditional_get.rb:40:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 27,
                "trace": "rack (2.2.4) lib/rack/head.rb:12:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 28,
                "trace": "activerecord (6.1.4.7) lib/active_record/migration.rb:601:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 29,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'"
            },
            {
                "exception_object_id": 81760,
                "id": 30,
                "trace": "activesupport (6.1.4.7) lib/active_support/callbacks.rb:98:in `run_callbacks'"
            },
            {
                "exception_object_id": 81760,
                "id": 31,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/callbacks.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 32,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/executor.rb:14:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 33,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 34,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 35,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 36,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:37:in `call_app'"
            },
            {
                "exception_object_id": 81760,
                "id": 37,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:26:in `block in call'"
            },
            {
                "exception_object_id": 81760,
                "id": 38,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:99:in `block in tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 39,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:37:in `tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 40,
                "trace": "activesupport (6.1.4.7) lib/active_support/tagged_logging.rb:99:in `tagged'"
            },
            {
                "exception_object_id": 81760,
                "id": 41,
                "trace": "railties (6.1.4.7) lib/rails/rack/logger.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 42,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 43,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/request_id.rb:26:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 44,
                "trace": "rack (2.2.4) lib/rack/runtime.rb:22:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 45,
                "trace": "activesupport (6.1.4.7) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 46,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/executor.rb:14:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 47,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/static.rb:24:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 48,
                "trace": "rack (2.2.4) lib/rack/sendfile.rb:110:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 49,
                "trace": "actionpack (6.1.4.7) lib/action_dispatch/middleware/host_authorization.rb:119:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 50,
                "trace": "rack-cors (1.1.1) lib/rack/cors.rb:100:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 51,
                "trace": "railties (6.1.4.7) lib/rails/engine.rb:539:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 52,
                "trace": "puma (4.3.12) lib/puma/configuration.rb:228:in `call'"
            },
            {
                "exception_object_id": 81760,
                "id": 53,
                "trace": "puma (4.3.12) lib/puma/server.rb:727:in `handle_request'"
            },
            {
                "exception_object_id": 81760,
                "id": 54,
                "trace": "puma (4.3.12) lib/puma/server.rb:476:in `process_client'"
            },
            {
                "exception_object_id": 81760,
                "id": 55,
                "trace": "puma (4.3.12) lib/puma/server.rb:332:in `block in run'"
            },
            {
                "exception_object_id": 81760,
                "id": 56,
                "trace": "puma (4.3.12) lib/puma/thread_pool.rb:134:in `block in spawn_thread'"
            }
        ]
    }
}

这对调试应用程序非常有帮助。

有没有办法返回像这样的完整错误,以及我的自定义错误消息(但不是在生产中)?

谢谢!

json ruby-on-rails ruby api 错误处理

评论

2赞 Jax 11/11/2022
嗯,你真的希望你的用户看到整个堆栈跟踪吗?我想说的是,应该将自定义错误返回给用户,然后您可以将整个错误记录到错误跟踪器应用程序或 ELK 类型仪表板中
0赞 gordie 11/11/2022
@Jax :也许有一种只在开发时而不是在生产时返回堆栈的方法?
0赞 max 11/14/2022
或者只是在开发中改进您的方法/工具?这就是断点和工具的用途。debug
0赞 anothermh 11/16/2022
一个丑陋的黑客将是rescue StandardError => e; Rails.development? ? raise e : render status: 400, json: { message: e.to_s }

答: 暂无答案