Обработка исключений (EH), по-видимому, является текущим стандартом, и, проводя поиск в Интернете, я не могу найти никаких новых идей или методов, которые бы пытались ее улучшить или заменить (ну, некоторые варианты существуют, но ничего нового).
Хотя большинство людей, похоже, игнорируют это или просто принимают его, EH имеет некоторые огромные недостатки: исключения невидимы для кода, и он создает много и много возможных точек выхода. Joel on software написал статью об этом. Сравнение с goto
идеально подходит, это заставило меня снова подумать о EH.
Я стараюсь избегать EH и просто использовать возвращаемые значения, обратные вызовы или что-то подходящее для этой цели. Но , когда вам нужно писать надежный код, вы просто не можете игнорировать EH в наши дни: он начинается с new
, который может вызывать исключение вместо того, чтобы просто возвращать 0 (как в старом дней). Это делает любую строку кода С++ уязвимой для исключения. И тогда больше мест в исходном коде С++ генерируют исключения... std lib делает это и т.д.
Это ощущение, что идет по шатким основаниям. Итак, теперь мы вынуждены заботиться об исключениях!
Но его трудно, его действительно сложно. Вы должны научиться писать безопасный код исключения, и даже если у вас есть некоторый опыт работы с ним, все равно потребуется дважды проверить, что любая строка кода является безопасной! Или вы начинаете ставить блоки try/catch повсюду, что загромождает код, пока не достигнет состояния нечитаемости.
EH заменил старый чистый детерминированный подход (возвращаемые значения..), у которого было только несколько, но понятных и легко решаемых недостатков с подходом, который создает много возможных точек выхода в вашем коде, и если вы начнете писать код, который ловит исключения (что вам нужно сделать в какой-то момент), тогда он даже создает множество путей через ваш код (код в блоках catch, подумайте о серверной программе, где вам нужны средства ведения журнала, отличные от std:: cerr..). EH имеет преимущества, но это не главное.
Мои актуальные вопросы:
- Вы действительно пишете безопасный код исключения?
- Вы уверены, что ваш последний "готовый к производству" код является безопасным для исключения?
- Вы даже можете быть уверены, что это?
- Знаете ли вы и/или используете альтернативы, которые работают?