C++类中try catch用法对比:异常在类内处理还是上层调用方处理?
C++除法类异常处理规范解答
最优实现选择
最符合C++编码规范的是v4版本的设计思路,即类内仅抛出异常、交由上层调用方处理的模式。
其他版本的核心问题
- v1:存在明确运行错误,
readAgain函数中构造的临时对象未赋值给当前实例,用户输入新分母后原对象的分母仍然为0,逻辑完全无效;同时除法类耦合了用户输入输出逻辑,职责严重越界。 - v2/v3:和v1存在相同的职责越界问题,将用户交互、重试逻辑耦合在运算类中,导致类的复用性极低,只能用于交互式命令行场景,无法适配服务端、GUI、第三方库调用等其他场景。
- 前三个版本的共性问题:类内自行捕获并吞掉异常,上层调用者完全感知不到操作失败,会引发后续的隐形逻辑错误。
C++异常处理的通用规范
类的异常处理遵循单一职责原则和上下文相关处理原则
- 通用工具类(比如你实现的除法类):仅在发生错误时抛出异常即可,不要做任何业务相关的错误处理。建议抛出标准库异常类型(比如
std::invalid_argument),不要抛裸字符串,方便上层分类捕获处理。 - 异常的处理逻辑由发起上下文的上层调用方实现:如果是交互式场景,上层可以在catch块中实现重试逻辑;如果是服务端场景,上层可以直接返回错误响应;如果是离线计算场景,上层可以直接终止程序,类本身不需要关心调用方的业务逻辑。
重试逻辑的实现方案
你提到的v4版本无法实现重试是上层逻辑写法的问题,不需要把重试逻辑耦合到类内,调整后的main函数即可实现需求:
int main() { exceptionHandlingV5 ob; ob.setNumerator(4); int den; while (true) { cout << "请输入分母:"; cin >> den; try { ob.setDenominator(den); break; } catch(const char* e) { cout << e << "请重新输入" << endl; } } cout << ob.divide(); cout << "\nbye"; return 0; }
内容的提问来源于stack exchange,提问作者solo
相关产品推荐
相关产品推荐

