gpt4 book ai didi

c++ - throw, try {} catch {} 应该如何在现实世界中使用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:27 25 4
gpt4 key购买 nike

我的意思是,我知道关于 throw, try {} catch {} 的所有语言规则,但我不确定我是否在现实世界中正确使用它们。请看下面的例子:

我们有一大段科学代码可以进行各种图像处理,最近我们决定对其进行修饰并使其更加健壮。经常使用的例程之一是 void rotate_in_place(float* image, image_size sz);

为了让它更健壮,我们在代码的开头添加了一些健全性检查:

void rotate_in_place(float* image, image_size sz) {
// rotate_in_place does not support non-square image;
if (sz.nx != sz.ny) throw NonSquareImageError;
// rotate_in_place does not support image too small or too large
if (sz.nx <= 2 || sz.nx > 1024) throw WrongImageSizeError;
// Real rode here
.....
}

现在的问题是 rotate_in_place() 在超过 1000 个地方使用,我是否应该用 try{} catch {} 包装 rotate_in_place() 的每个调用,在我看来这会使代码非常臃肿。另一种可能性是不包装任何 try{} catch{} 并让程序退出,但这与仅使用有何不同

if (sz.nx != sz.ny) {
cerr << "Error: non-squared image error!\n";
exit(0);
}

总之,我不太确定使用throw、try、catch的真正好处,有什么好的建议吗?

最佳答案

每个处理错误的站点都需要 try-catch block 。这完全取决于您的设计,但我怀疑您是否需要处理每个 rotate_in_place 调用站点中的错误,您可能大部分时间都不会向上传播。

打印错误并使用 exit 是错误的,原因有以下三个:

  1. 你无法处理这个错误。 exit 没有处理(除非它在错误绝对严重时完成,但你的函数不知道 - 调用者可能有办法恢复)。
  2. 您通过写入硬编码流来扩展函数的职责,这甚至可能不可用(这是 rotate_in_place,而不是 rotate_in_place_and_print_errors_and_kill_the_program_if_something_is_wrong)— 这损害可重用性。
  3. 用这种方法你会丢失所有的调试信息(你可以从未处理的异常中生成堆栈跟踪,你不能对一个每次都退出的函数做任何事情——未处理的异常是一个错误,但它是一个你可以跟踪的错误来源)。

关于c++ - throw, try {} catch {} 应该如何在现实世界中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7621486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com