重用Try-Catch上声明的变量

时间:2014-12-05 19:00:41

标签: c++ try-catch

我正在使用像这样的try-catch块:

try {

    Texture heightmapTexture = Texture("Snow0101_7_M.jpg");

} catch (TextureLoadException exc) {
    std::cout << exc.what() << std::endl;
}

问题是我需要在程序中进一步重用变量heightmapTexture。 所以我意识到由于范围我不能这样做。我应该把剩下的程序放在范围内吗?对我来说没有任何意义。

我也不能在范围之外声明变量,因为我必须初始化它。它有一个只接收字符串作为输入的构造函数。

什么是最好的解决方案?

我意识到我可以使用指针,但我试图避免这种情况(我并不擅长防止内存泄漏)。

编辑:抱歉,我将变量声明为类Heightmap,这是错误的!它是一个纹理对象。但问题是一样的。

2 个答案:

答案 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;
}