boost::signals2 和异常处理

int*_*ger 5 c++ boost boost-signals2

是否有某种方法可以覆盖在 boost::signals2 中调用插槽并执行某些操作(日志记录、调试、异常处理)的特定时刻?

我想在槽调用时捕获异常,因为信号/槽是我的代码中的执行路径在各种软件组件之间交叉的地方,每个组件都是可选的/可以在运行时被禁用,如果它行为不端。因此,当插槽调用抛出(可能来自外部库,可能只是 std::bad_alloc)时,我希望收到有关它的通知——并知道哪个组件被发送到了——这样我就可以终止该组件。

我不知道如何在组合器中做到这一点,因为我无法访问那里的插槽或连接对象?所以我看不到获取任何信息的方法。(在每个插槽上更改返回类型是不可行的。)

有没有一些我错过的超级简单的方法来做到这一点?

如果没有,我该怎么办?

将诸如 slot_call_iterator(在 try/catch 中包装调用)和 connection_body_base(例如存储有关它属于哪个组件的信息)之类的东西子类化,并让 boost 使用这些?(如何?)

或者子类signals2::slot<...>,在构造函数中为其提供有关拥有组件的信息并以某种方式重载operator()(...)?(也不知道这一点,使用所有模板魔法似乎更难。)

Yes*_*ame 0

总结一下评论:

来自伊戈尔 R.

这样的功能似乎不存在,但您可以在 trac 中添加功能请求(甚至提供补丁)。

来自整数(好昵称):

感谢您的评论。是的,我认为它不存在,只是想知道是否有一种方法可以子类化或覆盖公开导出的增强类来制作我自己的类。尝试使用 boost 代码盲目地执行此操作可能会令人生畏,因为我担心做的事情可能会破坏或误用内部结构。