框架整体架构
- 异常捕获层:在每个线程的入口处设置异常捕获机制,捕获线程执行过程中抛出的所有异常。
- 错误处理层:定义错误处理策略,将捕获到的异常转化为错误信息,并进行相应处理,避免进程退出。
- 通用接口层:提供通用的接口,使得不同类型的线程函数都能使用该框架。
关键类和函数设计思路
- ThreadWrapper类:
- 功能:包装用户定义的线程函数,在其执行前后添加异常捕获逻辑。
- 成员变量:存储用户线程函数及其参数。
- 成员函数:构造函数用于初始化线程函数和参数,
run
函数用于执行线程函数并捕获异常。
- ErrorHandler类:
- 功能:定义错误处理的具体策略,如记录错误日志、进行错误恢复等。
- 成员函数:
handleError
函数接收异常信息并进行处理。
- createThread函数:
- 功能:作为框架的通用接口,创建并启动线程,使用
ThreadWrapper
包装用户线程函数。
核心代码示例
#include <iostream>
#include <thread>
#include <functional>
#include <exception>
#include <memory>
#include <sstream>
// 错误处理类
class ErrorHandler {
public:
virtual void handleError(const std::string& errorMessage) {
std::cerr << "Error: " << errorMessage << std::endl;
}
};
// 线程包装类
class ThreadWrapper {
public:
template<typename Func, typename... Args>
ThreadWrapper(Func&& func, Args&&... args)
: func(std::bind(std::forward<Func>(func), std::forward<Args>(args)...)) {}
void run(std::shared_ptr<ErrorHandler> errorHandler) {
try {
func();
} catch (const std::exception& e) {
std::ostringstream oss;
oss << "Exception caught: " << e.what();
errorHandler->handleError(oss.str());
} catch (...) {
errorHandler->handleError("Unknown exception caught");
}
}
private:
std::function<void()> func;
};
// 创建线程的通用接口
std::thread createThread(std::shared_ptr<ErrorHandler> errorHandler,
std::function<void()> func) {
ThreadWrapper wrapper(func);
return std::thread([&wrapper, errorHandler]() { wrapper.run(errorHandler); });
}
// 示例线程函数
void threadFunction() {
throw std::runtime_error("Simulated runtime error");
}
int main() {
auto errorHandler = std::make_shared<ErrorHandler>();
std::thread t = createThread(errorHandler, []() { threadFunction(); });
t.join();
return 0;
}
说明
- ErrorHandler类:定义了错误处理的虚函数
handleError
,用户可继承该类并实现自定义的错误处理逻辑。
- ThreadWrapper类:通过模板构造函数接受不同类型的线程函数及其参数,并在
run
函数中捕获异常。
- createThread函数:作为框架的入口,创建线程并启动,将错误处理逻辑传递给
ThreadWrapper
。
- 示例代码:在
main
函数中,创建了一个会抛出异常的线程函数,并通过框架启动线程,展示了框架的使用方式。