什么可以(以及什么不可以)在c中抛出异常?
是否存在可能导致c中异常的“代码语句”的完整列表(可能是递归定义的)?像这样的东西:
1)抛出语句(自然) 2)打电话给新人 3)调用标准库中可以抛出的任何函数. 4)调用包含1-3的操作的任何用户定义的函数(包括构造函数). 5)还有别的吗?在堆栈上分配本地对象,对内置类型进行操作,解除引用指针,类型转换 – 他们能够抛出吗? 6)其他一切都没有例外. 无异常我并不是指总是成功的操作.肯定不取消引用指针.但是将它包装在try-catch块中仍然没有意义,考虑异常安全的函数解除引用指针等等.因此,成功或导致未定义行为的代码可以被视为无异常. UPD.尽管我的最后一段我仍然得到一个评论,未定义的行为也可以抛出,所以让我解释一下我的意思.考虑以下代码: void bar(); Class C{ ... public: foo() { something_that_breaks_class_invariants; bar(); something_that_restores_class_invariants; } } 如果我正确理解异常安全是什么,那么如果bar()可以抛出异常,那么这段代码就不好了.我应该改变语句的顺序,或者我应该在try-catch块中包装bar(),恢复类不变量并进一步传播异常. 但是如果bar()成功返回或导致未定义的行为(因为,我不知道,还有其他东西被破坏),那么foo()就可以了. foo()不能做任何事情,也不应该关心bar()可能的未定义行为.在这个意义上,bar()是无异常的,可以标记为noexcept等. 所以我的问题是:在bar()中可以使用哪种语句来考虑它是无异常的? 解决方法
是的,可以详尽地定义可以引入C的事物列表.
>抛出表情 最后一点也适用于C的所有隐式函数调用:default / copy / move构造函数,重载运算符,析构函数(请注意那些默认为noexcept)和转换运算符. 如果您对特定表达式有疑问,可以使用noexcept运算符让编译器告诉您表达式是否理论上可能抛出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |