加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么可以(以及什么不可以)在c中抛出异常?

发布时间:2020-12-16 06:53:17 所属栏目:百科 来源:网络整理
导读:是否存在可能导致c中异常的“代码语句”的完整列表(可能是递归定义的)?像这样的东西: 1)抛出语句(自然) 2)打电话给新人 3)调用标准库中可以抛出的任何函数. 4)调用包含1-3的操作的任何用户定义的函数(包括构造函数). 5)还有别的吗?在堆栈上分配本地对象,
是否存在可能导致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的事物列表.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读