Синтаксически говоря, ваш код правильный. Идиотически говоря, может быть, не так много - или, по крайней мере, это зависит от контекста. Когда файл не может открыться, мы можем выполнить нашу обработку прямо внутри этого if( !file.good() )
, если это совершенно обычное явление и возможно. Например, если пользователь просит открыть файл в текстовом редакторе, то вполне вероятно, что файл не существует. С другой стороны, если редактор не может найти файл правописания, это означает, что что-то (возможно) ужасно неправильно. Программа, вероятно, не была установлена, или пользователь возился с этим файлом - все возможно.
В C ++ мы используем исключения для исключительных случаев . То есть случаи, которые на самом деле не предназначены для того, чтобы происходить, и которые мы не «принимаем». Это в отличие от пользовательского файла, который не открывается, или неправильного пользовательского ввода, или отсутствия подключения к Интернету: все это примеры совершенно правильных событий, распространенных ситуаций, событий, которые мы ожидаем рано или поздно в ходе выполнения программы. Они не исключительные .
Теперь, каковы преимущества использования исключений по сравнению с условными выражениями? Позвольте мне распространить этот вопрос на любой другой механизм перехода (goto
): возврат и условия. Исключения более выразительны, если вы хотите сказать следующее: если вы имеете дело с исключительным случаем, используйте исключения. Исключения также выполняются больше, чем обычные условия, аналогично тому, как виртуальные функции выполняются больше, чем условия. Правильный кодовый блок будет выполняться в зависимости от исключения, но правый scope будет обрабатывать исключение в зависимости от обработчиков.
У исключений есть и другие преимущества по сравнению с условными выражениями: исключения отделяют обработку ошибок от другого кода. Они позволяют связать произвольные данные и действия с состоянием ошибки. Они позволяют сообщать об успешных состояниях (через return
), а также об ошибках (через throw
). И этот список можно продолжить ...
Технически и на самом низком уровне исключения представляют собой сложный механизм прыжка. Еще в дни бабочки люди изобрели условное if
как несколько сложное goto
, чтобы повысить выразительность (потому что goto
можно использовать для чего угодно) и уменьшить ошибки программиста , Циклические конструкции, такие как петля C for
, также по сути представляют собой сложный прыжок с блестками и цветами радуги, опять же для уменьшения ошибок и повышения выразительности. C ++ представил свои новые операторы приведения по тем же причинам.
Итак: исключения - это не волшебство, а нечто новое в сцене по сравнению с условными выражениями и циклами. Не используйте их, когда вы этого не хотите, так же, как вы не используете цикл, когда вы действительно хотите использовать условное выражение.