我正在使用像这样的try-catch块:
try {
Texture heightmapTexture = Texture("Snow0101_7_M.jpg");
} catch (TextureLoadException exc) {
std::cout << exc.what() << std::endl;
}
问题是我需要在程序中进一步重用变量heightmapTexture。 所以我意识到由于范围我不能这样做。我应该把剩下的程序放在范围内吗?对我来说没有任何意义。
我也不能在范围之外声明变量,因为我必须初始化它。它有一个只接收字符串作为输入的构造函数。
什么是最好的解决方案?
我意识到我可以使用指针,但我试图避免这种情况(我并不擅长防止内存泄漏)。
编辑:抱歉,我将变量声明为类Heightmap,这是错误的!它是一个纹理对象。但问题是一样的。答案 0 :(得分:2)
您通常希望在一个try / catch上下文中包含所有逻辑。据推测,如果纹理的加载失败,它之后的所有内容也会失败吗?
在这种情况下,您可以更清晰地表达逻辑:
try {
Heightmap heightmapTexture = Texture("Snow0101_7_M.jpg");
// do your work here
// if anything fails fatally, throw
// do you need to store the height map in an object?
my_object.give_heightmap(std::move(heightmapTexture));
}
// report failures here
catch (TextureLoadException& exc) { // note: by reference
std::cout << exc.what() << std::endl;
}
catch (OtherReason& e) {
// report the reason
}
catch(exception& e) {
// other failures
}
考虑异常处理的一个好方法是,异常对象是对进程或序列失败的解释,而不是每个异常都是一个操作的错误代码。
答案 1 :(得分:0)
在try-catch块之外声明你的变量。
Heightmap *heightmapTexture = null;
try {
heightmapTexture = new Texture("Snow0101_7_M.jpg");
} catch (TextureLoadException exc) {
std::cout << exc.what() << std::endl;
}