C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了什么可以(以及什么不可以)在c中抛出异常?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
是否存在可能导致c中异常的“代码语句”的完整列表(可能是递归定义的)?像这样的东西:

1)抛出语句(自然)

2)打电话给新人

3)调用标准库中可以抛出的任何函数.

4)调用@R_227_11262@-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的事物列表.

>抛出表情
> new可以抛出bad_alloc
> dynamic_cast可以抛出bad_cast
> typ@R_197_11534@可以抛出bad_typ@R_197_11534@
>对函数的任何调用都不是noexcept或throw()

最后一点也适用于C的所有隐式函数调用:default / copy / move构造函数,重载运算符,析构函数(请注意那些认为noexcept)和转换运算符.

如果您对特定表达式有疑问,可以使用Noexcept运算符让编译器告诉您表达式是否理论上可能抛出.

大佬总结

以上是大佬教程为你收集整理的什么可以(以及什么不可以)在c中抛出异常?全部内容,希望文章能够帮你解决什么可以(以及什么不可以)在c中抛出异常?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。