gpt4 book ai didi

ruby - 从 V8 上下文获取 ruby​​ 异常

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

context = V8::Context.new(timeout: 20000) do |context|
context['ForbidAccess'] = ->(message) { throw NotImplementedError }
end

begin
context.eval("ForbidAccess();")
rescue => e
puts "e.class = #{e.class.name}"
puts "e.causes = #{e.causes}"
puts "e.root_cause = #{e.root_cause}"
puts "e.root_cause.class = #{e.root_cause.class}"
end

控制台输出:

e.class = V8::Error
e.causes = [#<V8::Error: uncaught throw NotImplementedError>, #<ArgumentError: uncaught throw NotImplementedError>]
e.root_cause = uncaught throw NotImplementedError
e.root_cause.class = ArgumentError

如何访问 NotImplementedError 对象?

(NotImplementedError 只是为了展示。它将被替换为包含消息等的自定义异常)

最佳答案

您可能没有按照自己的想法去做。 throw 关键字不适用于异常。它实际上是类似于其他语言的goto的本地跳转。看到这个片段:

catch :done do
while true
array = [1,2,3]
for i in array
if i > 2
throw :done
end
end
end
end

它只是一个控制流结构,其中“捕获”的对象必须与“抛出”的对象相匹配。但是您不能简单地捕获所有抛出并找出它是哪个对象。对于异常(如 NotImplementedError),正确的用法是 raise:

context = V8::Context.new(timeout: 20000) do |context|
context['ForbidAccess'] = ->(message) { raise NotImplementedError }
end

begin
context.eval("ForbidAccess();")
rescue => e
puts "e.root_cause = #{e.root_cause.inspect}"
# correctly prints #<NotImplementedError: NotImplementedError>
end

至于为什么会在那里看到 ArgumentError,很简单:throw 无法通过 begin-rescue 结构(即从异常中拯救)。当未捕获的抛出遇到救援时,会创建一个新的异常。检查以下内容:

begin
throw "whatever"
rescue e
p e #=> ArgumentError: uncaught throw "whatever"
end

这就是发生的事情 internally所有 V8 库都看到一个 ArgumentError 弹出。

关于ruby - 从 V8 上下文获取 ruby​​ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206103/

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