我有一个程序需要将异常从任何未被捕获的线程传播到主线程,以便它可以向用户提供有关失败原因和安全关闭的信息.我的InterThreadException处理程序似乎工作,但只有当引发异常的线程由主线程直接生成时.
在所有情况下都会正确调用InterTheadException处理程序,通过向其传递异常指针来通知传播异常,并且主线程接收到它已收到新异常的通知,但调用std :: rethrow_exception on异常指针只是失败,似乎什么也没做.我已经测试过从这两个不同的线程中抛出完全相同的异常,并且无论我抛出什么,问题似乎都会持续存在.
我怀疑我对如何使用异常指针有一个基本的误解,但我不确定.
这是我对InterThreadExceptionHandler的实现.
class InterThreadExceptionHandler : NonCopyable { public: InterThreadExceptionHandler(); ~InterThreadExceptionHandler(); // // Sends an exception into this handler,informing it that //this exception has been caught // and may be propagated to another thread // void sendException(std::exception_ptr exception); // // Freezes the calling thread until an exception has been sent,//then rethrows said exception // void waitForException(); private: std::vector<std::exception_ptr> sentExceptions; std::mutex sentExceptionsMutex; Semaphore sentExceptionsCounter; }; InterThreadExceptionHandler::InterThreadExceptionHandler() { } InterThreadExceptionHandler::~InterThreadExceptionHandler() { } void InterThreadExceptionHandler::sendException(std::exception_ptr exception) { ScopedLock lock(this->sentExceptionsMutex); this->sentExceptions.push_back(exception); this->sentExceptionsCounter.give(); } void InterThreadExceptionHandler::waitForException() { this->sentExceptionsCounter.take(); ScopedLock lock(this->sentExceptionsMutex); assert( this->sentExceptions.size() > 0 ); std::exception_ptr e = this->sentExceptions[0]; this->sentExceptions.erase(this->sentExceptions.begin()); if (e == std::exception_ptr()) { throw std::exception("Invalid exception propagated!"); } std::rethrow_exception(e); }
解决方法
对此抱歉不能直接回答您的问题,但无论如何它可能会有所帮助.
如果我通过捕获异常,检查返回代码等来检测线程中的运行时错误,我会让该线程冻结整个过程.我还将关闭ftracing(dtrace的Linux克隆),以便保留我可以获得的任何跟踪日志以解决问题.我担心我不知道Windows的等价物是什么.然后我可以附加一个调试器并查看发生了什么,甚至可以更正一个值并继续执行.
它在部署的代码中没那么有用,但在开发过程中它很棒.一个人对问题的看法是好的,因为一切都在那里“存在”,没有堆栈展开,其他线程没有太多机会到达任何地方,等等.这可以使故障识别更容易.对于已部署的代码,我可能会引发核心转储(我倾向于运行unixy).显然,如果需要进行一定程度的清理,那就不好了.