2014-12-05 2 views
2

Я использую примерки поймать блок, как это:Повторное использование переменных, объявленных на Try-Catch

try { 

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

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

Дело в том, что мне нужно повторно использовать переменную heightmapTexture далее в моей программе. Итак, я понял, что не могу этого сделать из-за объема. Должен ли я помещать остальную часть программы в область видимости? Для меня это не имеет никакого смысла.

Я также не могу объявить переменную за пределами области действия, потому что мне нужно ее инициализировать. Он имеет конструктор, который получает только входную строку.

Что было бы лучшим решением?

Я понимаю, что могу использовать указатель, но я стараюсь избегать этого (я не очень хорошо предотвращаю утечку памяти).

EDIT: Извините, я объявлял переменную как класс Heightmap, что неправильно !, это объект текстуры. Но проблема такая же.

+1

Используйте boost :: shared_ptr вместо необработанных указателей, избегайте утечек и решите проблему. – vishal129

+0

Объект, который может быть инициализирован, но не назначен? Можете ли вы изменить этот класс? – Silicomancer

+0

что вы имеете в виду @Silicomancer? Я предполагаю, что тогда это будет указатель. – lhahn

ответ

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 
} 

Хороший способ думать об обработке исключений является то, что объект исключения является объяснением вы присуждаете процесс или а не каждое исключение, являющееся кодом ошибки для одной операции.

+0

Думаю, я мог бы это сделать. Спасибо за совет. – lhahn

0

Объявите переменную за пределами блока try-catch.

Heightmap *heightmapTexture = null; 

try { 

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

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

Я не могу этого сделать в C++ – lhahn

+0

нет! Во-первых, для этого требуется, чтобы Heightmap имел конструктор по умолчанию. Во-вторых, он побеждает цель обработки исключений. –

+0

@ RichardHodges, который был о ответе или моем комментарии? – lhahn

Смежные вопросы