2013-08-08 2 views
0

Мне было интересно, подчиняются ли те же правила scope в C++, как и все остальное. Вот пример.Заброшенные объекты scope

try{ 
    Error err; 
    err.num = 10; 
    err.str = "This will be thrown." 
    throw err; 
} 
catch(Error e){ 
    cout << "Error num is: " << e.num << " error string is: " << e.str << endl; 
} 

ли эта работа или же тот факт, что err был создан в try блоке остановить его от использования в блоке поймать?

+1

Да, это работает. Вы бросаете «err», блок catch обрабатывает «e»; все, что вы инициализировали в «err», будет присутствовать в «e». – paulsm4

+4

Вы бросаете * копию * ... –

+0

Насколько я знаю, область действия в try объявленных переменных заканчивается при выполнении блока finally (То есть после catch). Но я не уверен – Manu343726

ответ

5

Мне было интересно, подчиняются ли те же правила сферы применения в C++, как и все остальное.

сам выброшен объект не имеет сферу, поскольку прицелы применяются только к именам и не имеет имени. Он имеет немного особый срок службы: он построен где-то по оператору throw, а затем уничтожается после обработки исключения. В этом случае брошенный объект является копией err. Кроме того, поскольку вы поймаете по значению, пойманный объект e является копией брошенного объекта, а не самого объекта.

Это работает или делает то, что err был создан в блоке try, чтобы он не использовался в блоке catch?

Он «работает» в том, что вы можете получить доступ к e (копии err) в catch блоке. Вы не можете получить доступ к самому err, поскольку он вышел из сферы действия и был уничтожен, когда программа оставила блок try; но копия остается нетронутой, пока вы не покинете блок catch.

+1

Это не «область», это время жизни. * Области ограничены {} и ничего больше. Нет ничего особенного в области охваченных объектов, – EJP

+0

@EJP: сам объект вообще не имеет области видимости, поскольку он не имеет имени; поэтому единственный разумный ответ - описать его время жизни и объем любых копий или ссылок на него. Но спасибо за отзывы; Я исправлю немного неряшливый язык моего ответа через минуту. –

+0

@EJP: Я считаю, что моя терминология теперь соответствует стандарту C++. Извините за любую путаницу. –

0

Да, это работает.

Вы бросаете «err», блок catch обрабатывает «e»; все, что вы инициализировали в «err», будет присутствовать в «e».

Вы можете абсолютно «поймать» любое исключение, которое вы «бросаете» в свой блок «try».

'Надеюсь, что это поможет.

+0

Без определения класса 'Error' вы не можете быть уверены, что все, инициализированное в' err', будет присутствовать в 'e'. –

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