Функция try блоков, но не в конструкторах - PullRequest
8 голосов
/ 08 октября 2010

просто быстрый вопрос.Есть ли какая-либо разница между

void f(Foo x) try
{
   ...
}
catch(exception& e)
{
   ...
}

и

void f(Foo x)
{
    try { ... }
    catch (exception& e)
    {
        ...
    }
}

?

Если нет, почему для функции используются блоки try (случай установки списков инициализации для конструкторов)в сторону) ?Что произойдет, если конструктор копирования Foo выдает исключение, когда x передается f?

Ответы [ 4 ]

10 голосов
/ 08 октября 2010

Функциональные блоки try нужны только в конструкторах. Во всех остальных случаях точно такой же эффект может быть достигнут путем помещения всего тела функции в обычный блок try / catch.

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

6 голосов
/ 08 октября 2010

Некоторые вещи разрешены, потому что было бы сложнее их запретить.Разрешение функции try блокирует некоторые, но не все тела функций усложнит грамматику и компиляторы.

3 голосов
/ 18 июля 2012

Только что заметил интересный момент в этом Докторе.Статья Добба (хотя и довольно старая):

... помните, что вы не можете вернуть значение в обработчике функции try-block.Поэтому нет смысла использовать функциональный блок try для непустой функции

, и это пример их кода:

int f()
try
{
   ...
}
catch(Error &e)
{
   // oops, can't return int from here!
}

Что фактически означает, что функциональные блоки попытки слабее , чем "обычные" блоки try, и их использование не рекомендуется, кроме как в конструкторах.

(статья за 2000 год, поэтому было бы неплохо, если бы кто-то прокомментировал, является ли этовсе еще так в текущем стандарте)

1 голос
/ 08 октября 2010

Блоки try функций были добавлены специально для того, чтобы перехватывать исключения в списках инициализации конструктора.

В вашем примере инициализация конструктора отсутствует, поэтому нет никакой разницы между двумя формами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...