【发布时间】:2011-11-29 02:33:06
【问题描述】:
我的意思是,我知道所有关于 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 的真正好处,有什么好的建议吗?
【问题讨论】:
-
图像作为原始指针?很高兴我不在你的代码库上工作。
-
好吧,我们在科学界工作,代码质量通常不是我们最关心的问题,因为主要目标是快速编写代码并快速计算结果。诸如错误处理、可扩展性、可读性之类的事情通常是事后才想到的。话虽如此,如果您能提出任何更好的解决方案,我将不胜感激。
-
std::vector用于数据(或者可能是 Boost.MultiArray),某种Image结构来保存数据和元数据。不关心质量似乎不太科学。 -
我的意思是,我们确实非常关心代码的正确性和效率,但我认为在其他问题上花费太多时间通常是矫枉过正。毕竟,我们不是软件工程师,我们只是想利用计算机的计算能力。
-
其实科学界对这个问题有很多争论。科学家应该在多大程度上关心编程?或者他们应该雇佣什么样的人?如果雇用同一科学领域的人,他知道所有的东西,但有时会练习草率的编码。如果聘请专业的程序员,需要付出很多努力向他解释。
标签: c++ exception try-catch throw