Понятия этого ответа взяты из языка программирования C ++ Бьярном Страуструпом.
КОРОТКИЙ ОТВЕТ
Да, исключение можно использовать в качестве метода возвращаемого значения.Примером является следующее для функции поиска двоичного дерева:
void fnd(Tree∗ p, const string& s)
{
if (s == p−>str) throw p; // found s
if (p−>left) fnd(p−>left,s);
if (p−>right) fnd(p−>right,s);
}
Tree∗ find(Tree∗ p, const string& s)
{
try {
fnd(p,s);
}
catch (Tree∗ q) {
// q->str==s
return q;
}
return 0;
}
Однако этого следует избегать, поскольку:
- они позволяют отделить код ошибки от «обычного кода»сделать вашу программу намного более читабельной, понятной и управляемой.Если вы используете их в качестве метода возврата, это больше не выполняется.
- возможны неэффективности, поскольку реализации исключений полагаются на предположение, что они используются в качестве методов обработки ошибок.
Кроме того, существуют дополнительные ограничения:
- исключения должны быть копируемого типа
- исключения могут обрабатывать только синхронные события
- их следует избегать вкритичная по времени система
- их следует избегать в больших старых программах, в которых управление ресурсами представляет собой случайный беспорядок (бесплатное хранилище бессистемно управляется с использованием открытых указателей, новостей и удалений), а не полагается на какую-то систематическую схему, такую какдескрипторы ресурсов (строковые векторы).
Более длинный ответ
Исключением является объект, выданный для представления возникновения ошибки.Это может быть любой тип, который может быть скопирован, но настоятельно рекомендуется использовать только определенные пользователем типы, специально определенные для этой цели.Исключения позволяют программисту явно отделять код обработки ошибок от «обычного кода», делая программу более читабельной.
Прежде всего, исключения предназначены для управления синхронными событиями , а не асинхронными.Это одно из первых ограничений.
Можно рассматривать механизмы обработки исключений как просто другую структуру управления, альтернативный способ возврата значения вызывающей стороне.
Это имеет некоторое очарование, но следует избегать , поскольку это может привести к путанице и неэффективности.Страуструп предлагает:
Когда вообще возможно придерживаться представления «обработка исключений - обработка ошибок».Когда это сделано, код делится на две категории: обычный код и код обработки ошибок.Это делает код более понятным.Кроме того, реализации механизмов исключения оптимизируются на основе предположения, что эта простая модель лежит в основе использования исключения.
Поэтому в принципе следует избегать использования исключений для возвращаемого значения, поскольку
- Реализация исключений оптимизирована при условии, что они используются для обработки ошибок, а не для возврата значений , следовательно, они могут быть неэффективными для этого;
- Они позволяют отделить код ошибки из обычный код делает код намного более читабельным и понятным. Все, что помогает сохранить четкую модель того, что является ошибкой и как она обрабатывается, следует ценить .
Существуют программы, которые по практическим или историческим причинам не могут использовать исключения (никак обработка ошибок, так даже меньше):
- Критически важный по времени компонент встроенной системы, в котором работа должна быть гарантированно завершена в указанное максимальное время.В отсутствие инструментов, которые могут точно оценить максимальное время распространения исключения от
throw
до catch
, должны использоваться альтернативные методы обработки ошибок. - Большая старая программа, в которой управление ресурсами является рекламой.hoc mess (бесплатное хранилище бессистемно управляется с использованием открытых указателей,
news
и delete
), а не полагается на какую-то систематическую схему, такую как дескрипторы ресурсов (string
s vector
s).
В вышеупомянутых случаях предпочтительны традиционные методы перед исключением.