在软件开发过程中,异常处理和错误检查是保证程序稳定性和健壮性的重要手段。本文将介绍一种在C++中实现异常处理和错误检查的方法,这种方法通过模板类HResultChecker
和HResultT
来实现,旨在简化错误处理流程,提高代码的可读性和维护性。
模板类HResultChecker
是一个用于检查HRESULT值的辅助类,它根据模板参数ThrowException
的值来决定是否抛出异常。如果ThrowException
为true,则在检测到错误时抛出异常;如果为false,则不抛出异常。
以下是HResultChecker
模板类的实现:
template<bool ThrowException>
struct HResultChecker {
static void Check(HRESULT hr);
};
template<>
struct HResultChecker<false> {
static void Check(HRESULT hr) {
hr;
}
};
template<>
struct HResultChecker<true> {
static void Check(HRESULT hr) {
if (FAILED(hr)) {
AtlThrow(hr);
}
}
};
类HResultT
是一个用于存储和处理HRESULT值的模板类,它提供了构造函数、赋值操作符、错误信息获取函数和HRESULT值提取操作符等功能。
以下是HResultT
类的实现:
template<bool ThrowException>
class HResultT {
public:
HResultT(HRESULT hr = S_OK) { Assign(hr); }
HResultT &operator = (HRESULT hr) {
Assign(hr);
return *this;
}
LPCTSTR ErrorMessage() {
// a lot of code
}
operator HRESULT () {
return m_hr;
}
private:
void Assign(HRESULT hr) {
HResultChecker<ThrowException>::Check(m_hr = hr);
}
HRESULT m_hr;
std::basic_string<TCHAR> m_desc;
};
使用HResultT
类非常简单,可以在函数内部捕获异常,或者将其传递给调用者。
以下是使用HResultT
类的示例:
void function() {
HResult hr;
try {
hr = MakeSomething();
hr = MakeSomethingElse();
hr = MakeTheFinalSomething();
} catch (CAtlException &e) {
cout << "wow! Error " << e.m_hr << ": " << e.ErrorMessage() << "\n";
}
}
void Class::Method() throw (CAtlException) {
HResult hr = MakeSomething();
hr = MakeSomethingElse();
hr = MakeTheFinalSomething();
}