gpt4 book ai didi

ruby-on-rails - 在 Rails 中,有没有办法从 rescue_from 中提取 "short-circuit"?

转载 作者:数据小太阳 更新时间:2023-10-29 08:10:56 24 4
gpt4 key购买 nike

我正在尝试为 Rails 中的 Redis 提供一个用户友好的故障安全恢复。我正在使用内置的 redis_cache_store 并设置了 reconnect_attempts,但我想在 Redis 仍然关闭的情况下将用户发送到自定义错误页面,而不是让他们卡在无响应的页面上,不知道发生了什么。

我尝试的是通过重新引发一种新的错误类型 RedisUnavailableError 来猴子修补 RedisCacheStore 中的 failsafe 方法,它然后我有我的 application_controller 捕获和 redirect_to 静态 500 页面。

问题在于我希望我的应用程序在重定向后停止。在下面的 byebug 跟踪中,您可以看到在我包含的倒数第二个 block 之前,到达了 redirect 行。

但它并没有停止;我只包含了一系列调用的进一步方法中的第一个,这些方法最终导致再次尝试写入 Redis,它仍然处于关闭状态,然后重新引发相同的异常序列,然后 Rails 将不会捕获第二个时间(事实上,即使这样做,那也将是一个无限循环)。

所以我的问题是:有什么方法可以让 rescue_from block 停止停止,而不是在到达特定行后继续触发其他任何东西?

或者,是否有任何方法可以即时“禁用”Redis 或将缓存存储/设置更改为 rescue_from block 中的某个无效值,以便进一步触发的任何内容都不会尝试交谈到 Redis?

    [40, 49] in (DELETED)/redis_failsafe.rb
40: rescue ::Redis::BaseConnectionError => e
41: byebug
42: handle_exception(exception: e, method: method, returning: returning)
43: returning
44: byebug
=> 45: raise RedisUnavailableError
46: # Re-raise the exception when reconnect attempt fails, so our application controller can handle it.
47: end
48: end
49:
(byebug) c

[INFO][15:50:51] [3cf7] [GET] [(DELETED):3000] [/suppliers]
∙ Redirecting to 500 page due to: RedisUnavailableError

[30, 39] in /(DELETED)/application_controller.rb
30: authorize_resource class: false
31:
32: rescue_from RedisUnavailableError do |exception|
33: byebug
34: Rails.logger.info "Redirecting to 500 page due to: #{exception.message}"
=> 35: redirect_to '/500.html'
36: byebug
37: end
38:
39: rescue_from ActiveRecord::RecordNotFound do
(byebug) n
∙ Redirected to http://(DELETED)/500.html
Return value is: nil

[32, 41] in /(DELETED)/application_controller.rb
32: rescue_from RedisUnavailableError do |exception|
33: byebug
34: Rails.logger.info "Redirecting to 500 page due to: #{exception.message}"
35: redirect_to '/500.html'
36: byebug
=> 37: end
38:
39: rescue_from ActiveRecord::RecordNotFound do
40: render status: :not_found, plain: 'Not found'
41: end
(byebug) n

[51, 60] in /(DELETED)/rescuable.rb
51: def rescue_with_handler(exception, object: self, visited_exceptions: [])
52: visited_exceptions << exception
53:
54: if handler = handler_for_rescue(exception, object: object)
55: handler.call exception
=> 56: exception
57: elsif exception
58: if visited_exceptions.include?(exception.cause)
59: nil
60: else
(byebug)

最佳答案

So my question is: is there any way to get the rescue_from block to just stop and not continue triggering anything else after a certain line is reached?

是的,只需调用 ruby​​ break 关键字即可。

break 用于完全突破一个 block 。 next 用于跳出一个 block 并继续进行下一次迭代(就像在 while 循环中一样)。它们非常有用。

关于ruby-on-rails - 在 Rails 中,有没有办法从 rescue_from 中提取 "short-circuit"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57981292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com