在C回调中尝试{} catch(...){}-好主意吗?

Nonneneo

我正在用C ++实现回调,它将从普通C代码中调用。我的main()函数已经是C ++,但是C代码将负责创建线程,这些线程最终将调用我的回调。

现在我的回调看起来像

int handle_foo(void *userdata) {
    try {
        MyCPPClass *obj = static_cast<MyCPPClass *>(userdata);
        obj->doStuff();
        return 0; // no error
    } catch(...) {
        LogError("doStuff failed"); 
        return -1; // error
    }
}

可以,但是对我来说似乎很奇怪。此外,我失去了一些有用的功能,例如发现被抛出的内容的能力(没有catch在我的每个回调中添加大量额外的语句)。

try {} catch(...) {}这里合理的,或者是有没有更好的方式来写我的C回调?

锋利的牙齿

是的,您必须捕获异常并将其转换为有用的东西。通过C代码传播异常会导致未定义的行为。充其量您不能期望C代码保持一致的程序状态。

请参阅此答案作为简单示例。一个较难的示例是使用某些复杂的软件(例如SQLite)-C代码将获取一些互斥锁,并且不会释放该互斥锁,因为该异常只是“飞过”并且您的程序现在已被烘烤。

如果所有代码都是基于相同的C ++运行时构建的,那么这也有可能“起作用”。如果您碰巧在Visual C ++ 9中实现了回调,而在Visual C ++ 10中的其余代码或这些部分的其余部分是针对静态运行时库编译的,则您现在拥有两个截然不同的运行时,并且回调中的未处理异常会导致terminate()被调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django:模板中的变量是个好主意吗?

来自分类Dev

AWS VPC中的docker容器,好主意吗?

来自分类Dev

在Lubuntu中安装gedit是个好主意吗?

来自分类Dev

在Javascript中向数组添加属性-好主意吗?

来自分类Dev

在Clojure中强制垃圾回收是个好主意吗?

来自分类Dev

在Lubuntu中安装gedit是个好主意吗?

来自分类Dev

AWS VPC中的docker容器,好主意吗?

来自分类Dev

静态类中的私有静态成员...好主意吗?

来自分类Dev

在Android中声明静态视图是个好主意吗?

来自分类Dev

在 DAO 中存储验证是个好主意吗?

来自分类Dev

为嵌套的PDO操作嵌套Try / Catch是一个好主意吗?

来自分类Dev

在Rails ActiveRecord模型中,使用after_initialize回调不是一个好主意吗?

来自分类Dev

使用宏在C中实现通用向量。这是一个好主意吗?

来自分类Dev

在C ++构造函数中循环是一个好主意吗?

来自分类Dev

在 libgdx 中,在不同线程中调用 stage.act 是个好主意吗?

来自分类Dev

在整个应用程序中缓存NSDateformatter是个好主意吗?

来自分类Dev

临时扩展Java中的现有对象-这是一个好主意吗?

来自分类Dev

将聊天消息存储在mongodb集合中是个好主意吗?

来自分类Dev

使用goto避免深度函数调用中的堆栈溢出是一个好主意吗?

来自分类Dev

元组模式与原子匹配在Erlang中是个好主意吗?

来自分类Dev

在输出对象中包含其他信息是一个好主意吗?

来自分类Dev

在Firebase中,使用单独的端点为许多关系建模是个好主意吗?

来自分类Dev

在AngularJS应用程序中创建多个ng-app是一个好主意吗?

来自分类Dev

iOS:从iOS应用中删除1x图像是个好主意吗?

来自分类Dev

使用“ is”检查变量中包含哪个函数是一个好主意吗?

来自分类Dev

读取NoSQL DB时在移动应用程序中缓存数据是个好主意吗?

来自分类Dev

在单元测试中使用与被测系统中相同的常量是一个好主意吗?

来自分类Dev

在Javascript中以“功能形式”的if-as-expression是一个好主意吗?

来自分类Dev

对于移动应用程序中的会话管理,cookie是一个好主意吗?

Related 相关文章

  1. 1

    Django:模板中的变量是个好主意吗?

  2. 2

    AWS VPC中的docker容器,好主意吗?

  3. 3

    在Lubuntu中安装gedit是个好主意吗?

  4. 4

    在Javascript中向数组添加属性-好主意吗?

  5. 5

    在Clojure中强制垃圾回收是个好主意吗?

  6. 6

    在Lubuntu中安装gedit是个好主意吗?

  7. 7

    AWS VPC中的docker容器,好主意吗?

  8. 8

    静态类中的私有静态成员...好主意吗?

  9. 9

    在Android中声明静态视图是个好主意吗?

  10. 10

    在 DAO 中存储验证是个好主意吗?

  11. 11

    为嵌套的PDO操作嵌套Try / Catch是一个好主意吗?

  12. 12

    在Rails ActiveRecord模型中,使用after_initialize回调不是一个好主意吗?

  13. 13

    使用宏在C中实现通用向量。这是一个好主意吗?

  14. 14

    在C ++构造函数中循环是一个好主意吗?

  15. 15

    在 libgdx 中,在不同线程中调用 stage.act 是个好主意吗?

  16. 16

    在整个应用程序中缓存NSDateformatter是个好主意吗?

  17. 17

    临时扩展Java中的现有对象-这是一个好主意吗?

  18. 18

    将聊天消息存储在mongodb集合中是个好主意吗?

  19. 19

    使用goto避免深度函数调用中的堆栈溢出是一个好主意吗?

  20. 20

    元组模式与原子匹配在Erlang中是个好主意吗?

  21. 21

    在输出对象中包含其他信息是一个好主意吗?

  22. 22

    在Firebase中,使用单独的端点为许多关系建模是个好主意吗?

  23. 23

    在AngularJS应用程序中创建多个ng-app是一个好主意吗?

  24. 24

    iOS:从iOS应用中删除1x图像是个好主意吗?

  25. 25

    使用“ is”检查变量中包含哪个函数是一个好主意吗?

  26. 26

    读取NoSQL DB时在移动应用程序中缓存数据是个好主意吗?

  27. 27

    在单元测试中使用与被测系统中相同的常量是一个好主意吗?

  28. 28

    在Javascript中以“功能形式”的if-as-expression是一个好主意吗?

  29. 29

    对于移动应用程序中的会话管理,cookie是一个好主意吗?

热门标签

归档