美文网首页
c++11中如何正确的处理线程中的异常?

c++11中如何正确的处理线程中的异常?

作者: 安安爸Chris | 来源:发表于2018-09-06 15:01 被阅读0次

在线程中,如果产生了异常,没有捕获处理的话,系统会直接调用std::terminate终止进程的。因为一个线程的异常,导致整个进程终止,是不太划算的。因此,尽量保证线程运行中异常能够被处理。

线程异常被单独拿出来说,说明它还是有一点麻烦的。不能想当然去处理。下面是一段想当然的常见错误处理。

// 错误样例
int main() {
    try {
        thread t([]() {
            cout << "this will crash!" << endl;
            string s;
            char c = s.at(2);
        });
        t.join();
    } catch (...) {
        cout << "catched the exception!" << endl;
    }

    return 0;
}

执行结果如下:


执行结果1.PNG

这是因为主线程中是抓不到其他线程的异常的

所以,简单的做法是每个线程自己保证安全,自己在内部try catch。改造一下代码

int main() {

    thread t([]() {
        try {
            cout << "this will crash!" << endl;
            string s;
            char c = s.at(2);
        } catch (out_of_range &e) {
            cout << "catched the exception:" << e.what() << endl;
        }
    });
    t.join();
    cout << "happy ending!" << endl;

    return 0;
}

结果如下


执行结果2.PNG

可是你希望在主线程能够捕获到这个线程的异常,那么该怎么办呢?
稍微麻烦点。需要通过全局变量或者静态变量将子线程中的异常保存,然后在主线程中rethrow-try-catch。
代码如下:

exception_ptr eptr = nullptr;
int main() {

    thread t([]() {
        cout << "this will crash!" << endl;
        try {
            string s;
            char c = s.at(2);
        } catch (...) {
            eptr = current_exception();
            cout << "catched the exception!" << endl;
        }
    });
    t.join();

    try {
        if (eptr) {
            cout << "rethrow exception!" << endl;
            rethrow_exception(eptr);
        } 

    } catch (exception &e) {
        cout << "the exception is " << e.what()<< endl;
    }
    cout << "happy ending!" << endl;
    return 0;
}

结果如下


执行结果3.PNG

相关文章

  • c++11中如何正确的处理线程中的异常?

    在线程中,如果产生了异常,没有捕获处理的话,系统会直接调用std::terminate终止进程的。因为一个线程的异...

  • Java多线程: 如何捕获多线程中的异常

    你处理过多线程中异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗? 除了try ...

  • Java多线程异常处理

    线程异常处理 Java中每个线程的异常处理是相互独立的,一个线程产生的异常不会影响其他线程的正常运行。因此,也不能...

  • Java线程系列——线程异常处理

    1.子线程中处理异常的弊端 多线程抛出的异常,容易在主线程大量的日志打印中丢失,给日志排查带来了一定的困难。如下面...

  • Java异常的优雅设计

    导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈...

  • 都是程序员,设计Java异常的时候要优雅

    导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈...

  • 如何优雅的设计Java异常

    导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈...

  • 多线程之线程属性

    线程属性 线程优先级 守护线程 线程组 处理未捕获异常的处理器 1. 线程优先级 在java中,每个线程都有一个...

  • java入门学习提升第十七篇:Java异常处理(下)

    今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势...

  • python3 线程池和异常处理

    引用 线程池的基本使用as_completedwaitmap 线程池的异常处理 进程池用法 引用 Python中已...

网友评论

      本文标题:c++11中如何正确的处理线程中的异常?

      本文链接:https://www.haomeiwen.com/subject/scdxgftx.html