gpt4 book ai didi

ruby-on-rails - 抢救模块内特定类型的所有错误

转载 作者:行者123 更新时间:2023-12-04 14:29:47 26 4
gpt4 key购买 nike

我有一个模块,我在其中执行项目的所有加密/解密任务。我想捕获任何OpenSSL::Cipher::CipherError此模块中发生的异常,以便我可以处理它们。

是否可以做类似的事情

rescue_from OpenSSL::Cipher::CipherError, :with => :cipher_error

在模块内部?

最佳答案

我进行了一些调查并提出了解决方案。您说您有一个模块可以在其中进行加密。我猜那个模块代表一个单例。但是,我的解决方案需要您有一个实例。

class Crypto
def self.instance
@__instance__ ||= new
end
end

提取模块中的加密行为。
module Encryptable
def encrypt
# ...
end

def decrypt
# ...
end
end

创建一个处理异常的新模块。
module ExceptionHandler
extend ActiveSupport::Concern

included do
include ActiveSupport::Rescuable
rescue_from StandardError, :with => :known_error
end

def handle_known_exceptions
yield
rescue => ex
rescue_with_handler(ex) || raise
end

def known_error(ex)
Rails.logger.error "[ExceptionHandler] Exception #{ex.class}: #{ex.message}"
end
end

所以现在你可以使用新定义的 handle_known_exceptions在您的 Crypto 内.这不是很方便,因为你没有得到太多。您仍然必须在每个方法中调用异常处理程序:
class Crypto
include ExceptionHandler

def print_bunnies
handle_known_exceptions do
File.open("bunnies")
end
end
end

如果我们定义一个为我们执行此操作的委托(delegate)者,则无需执行此操作:
class CryptoDelegator
include ExceptionHandler

def initialize(target)
@target = target
end

def method_missing(*args, &block)
handle_known_exceptions do
@target.send(*args, &block)
end
end
end

完全覆盖 Crypto 的初始化, 改为使用委托(delegate)人。
class Crypto
include Encryptable

def self.new(*args, &block)
CryptoDelegator.new(super)
end

def self.instance
@__instance__ ||= new
end
end

就是这样!

关于ruby-on-rails - 抢救模块内特定类型的所有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16567243/

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