有时您需要使用未维护的、旧的、脏的、巨大的、对我们的程序可能有危险的库。
是否有以安全方式执行此代码的最佳实践?
最近,我发现(可能是在我的知识和经验水平上)没有捕捉到异常。直到今天,我使用的常见做法是将代码包装到Fiber中,在内部捕获异常并通过Channel发送出去。现在它不工作(我不能把产量或Proc放在光纤中)。
危险的lib可以看起来像普通类,方法用Fiber.yield封装光纤,以便现在交换执行到其他光纤。在现实生活中,这种光纤可能包含内部工作与IO,这并不重要。
class LibDangerous
def exec_remote
spawn do
raise IO::Error.new
end
Fiber.yield
end
end
应该处理异常的包装器由begin上的嵌套方法组成。。。救援
。我从顶层调用方法,从最后一个包装器方法返回lib方法,即使使用blockbegin。。。救援
。
class Wrapper
def capture
begin
yield self
rescue
puts "rescued from :capture"
end
end
def guard
begin
capture do |this|
yield this
end
rescue
puts "rescued from :guard"
end
end
def run
begin
yield LibDangerous.new
rescue ex
puts "rescued from :run"
end
end
end
这似乎是因为您需要在发生异常的同一级别处理异常,但是由于各种原因,我不能修改别人库的代码。
wrapper = Wrapper.new
result = wrapper.guard do |sandbox|
begin
sandbox.run do |library|
library.exec_remote
end
rescue
puts "rescued from top-level"
end
end
嘣!(play.crystal-lang.org代码)
Unhandled exception in spawn: (IO::Error)
from /eval:4:7 in '->'
from /usr/lib/crystal/fiber.cr:255:3 in 'run'
from /usr/lib/crystal/fiber.cr:92:34 in '->'
from ???
这可能是由于交换可执行上下文而发生的:我的代码和异常在不同的上下文中,不能交互?如果删除光纤,则异常像往常一样被捕获。
是否可以在不修改原始库的情况下解决此问题?
不,如果不修补原始错误代码,您就无法处理此问题。然而,Crystal的开放类系统使这完全从您的角度成为可能,直到上游行为得到修复,您可以在代码中重新定义方法。
请注意,这只是处理操作失败这一事实的一个问题。如果您可以通过其他方式获得该信息,例如使用选择
等待超时结果,或者您根本不关心操作是否成功,那么唯一真正的问题是日志垃圾邮件。一根光纤,那不是主光纤,崩溃不会让你的程序崩溃!(见https://play.crystal-lang.org/#/r/98da)
为什么会这样?引发异常意味着向上遍历当前堆栈,直到找到处理程序。当您看到“unhandredexception”时,这只是Crystal在每个堆栈根上放置的默认处理程序。什么是纤维?这是一个单独的堆栈!因此,在光纤内提升不会解开任何其他堆叠,尤其是主光纤。
我想知道,我怎么能设置回调光纤错误抛出。 例子: 我考虑在下次api访问时检查光纤:状态。或者创建一个光纤看门狗,如果我想要状态是有效的。这对我有用,但似乎不是最好的解决方案。
本文向大家介绍光纤和铜线的比较,包括了光纤和铜线的比较的使用技巧和注意事项,需要的朋友参考一下 由于与传统的铜线相比具有许多优点,因此光缆的使用量正在增加。但是,其用法也有一些缺点。 光纤电缆比铜线的优势 光纤电缆传输数据的速度远高于铜线。这是因为光的速度大于电子的速度。 与铜线的10 Gbps带宽相比,光缆的带宽更大,超过60 Tbps。 光纤电缆的衰减非常低。中继器仅需每50公里添加一次,而铜
问题内容: 我知道有关使用协程作为基础并实现玩具调度程序的基本知识。但是我认为它对于整个异步调度程序来说过于简单了。我的想法中缺少一整套漏洞。 如何防止cpu运行正在空闲/正在等待的调度程序?一些光纤刚刚进入睡眠状态,其他一些则等待来自操作系统的输入。 问题答案: 您需要将io操作复用到基于事件的接口(选择/轮询)中,以便可以利用OS进行等待,同时仍然可以调度其他光纤。select / poll具
本文向大家介绍光纤与同轴电缆的区别,包括了光纤与同轴电缆的区别的使用技巧和注意事项,需要的朋友参考一下 光纤和同轴电缆都是不同类型的引导介质电缆。光纤由塑料和玻璃制成,用于传输光或光学形式的信号,而同轴电缆由塑料和铜线制成,并用于传输电信号形式的信号。 以下是光纤和同轴电缆之间的一些重要区别。 序号 键 光纤 同轴电缆 1 传动方式 光纤以光的形式传输数据/信号。 同轴电缆以电信号的形式传输数据/
我从一个网站下载了一组文件,并在blender中导出了glb、gltf和mtl文件。我可以让glb或gltf文件显示在反应三纤维场景,但我不知道如何让纹理显示正确。我遇到了几个演示,但它们看起来很旧,什么不起作用。 下面是我如何加载文件。
简报:我试图在一个反应三纤维场景中,将一个“德瑞文本”元素父化到球体外部靠近引脚的一点。因此,当球体旋转或相机围绕球体旋转时,文本位置以球体外部为中心。 一个例子:三个。js文本对齐 问题: 如何查找对象或对象的部分/点的局部和世界空间位置? 如何将父对象定位到子对象,以便当父对象移动时,子对象随之移动? 场景是否具有相对于[0,0,0]轴的世界位置和相对于对象的局部位置? 我的代码沙盒:地球与位