Может ли исключение быть полностью заменено, если .. еще? - PullRequest
2 голосов
/ 16 августа 2011

Я новичок в программировании и у меня есть концептуальный вопрос.

То есть, может ли "исключение" быть полностью заменено на "если .. еще"?

Я знаю "исключение«Это обработка некоторых исключительных условий, которые могут вызвать ошибку или сбой.

Но мы также используем« if .. else »для обеспечения правильности значения переменных, не так ли?

Или «исключение» действительно можно заменить на «если .. еще», но использование «исключения» имеет другие преимущества (например, удобство?)

Спасибо, и извините за мой плохой английский.

Ответы [ 6 ]

3 голосов
/ 16 августа 2011

Самое большое различие между исключениями и «if..else» заключается в том, что исключения пропускают стек вызовов: исключение, вызванное в одной функции, может быть перехвачено в вызывающей программе на любое количество кадров в стеке.Использование операторов if не позволяет передавать управление таким образом, все должно обрабатываться в той же функции, которая обнаружила условие.

2 голосов
/ 16 августа 2011

Технически, ответ - да, исключения могут быть полностью заменены на if-else.Многие языки, например C, не имеют собственного понятия исключений, которые могут быть выброшены и перехвачены.

Основным преимуществом исключений является удобочитаемость кода и удобство сопровождения.Они служат другой цели, чем если бы еще.Исключения - для исключительных условий, тогда как if-else - для выполнения программы.

См. эту превосходную статью , объясняющую разницу.

1 голос
/ 18 августа 2011

Большинство ваших вопросов относятся к Python, поэтому вот ответ, основанный на этом факте.

В Python идиоматично (или «pythonic») использовать блоки try - except.Мы называем это "EAFP": Проще просить прощения, чем разрешение .

В C, где исключений не было, обычно "LBYL": смотрите, прежде чем прыгнуть , в результате чего получается множество операторов if (...).

Итак, хотя вы можете использовать LBYL, вы должны следовать идиомам языка, на котором вы программируете: использование исключений для обработки исключительных случаев и if -условий для условных выражений.

0 голосов
/ 16 августа 2011

В большинстве языков высокого уровня работа с исключениями часто более эффективна, чем if-else, поскольку вы избегаете многократной проверки. например:

if value is not 0 then print 10 / value

В большинстве интерпретаторов 10 / value будет внутренне проверять, является ли value допустимым делителем, прежде чем использовать его, так что вы фактически дважды проверяли одну и ту же проблему. В некоторых случаях исключение может исходить от аппаратного обеспечения, поэтому проверка программного обеспечения вообще не выполняется.

С другой стороны:

try print 10 / value ... catch exception

Будет только проверять, является ли значение действительным один раз. Более того, есть большая вероятность, что тест будет лучше оптимизирован, чем ваш собственный код, и будет способен обрабатывать действительно неожиданные условия (например, ошибки нехватки памяти).

0 голосов
/ 16 августа 2011

Старый способ обработки ошибки из функции выглядит примерно так:

int result = function_returns_error_code();
if (result != GOOD)
{
    /* handle problem */
}
else
{
   /* keep going */
}

Проблема с этим решением (и другими подобными ему - использование if-else) состоит в том, что если есть реальная проблема, и программист не обрабатывает ее должным образом с помощью if ... else (если функция возвращает ошибку код, указывающий на серьезные проблемы, но программист забывает об этом), он игнорируется. За исключением, он идет дальше и дальше вверх по стеку вызовов), пока он не будет обработан или программа не закроется.

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

0 голосов
/ 16 августа 2011

Это много отраслевых условий для управления.Теоретически исключения не нужны для идеального кода, но идеальный код не существует в реальной жизни.Исключения представляют собой хорошо отлаженный механизм для решения проблем контролируемым образом.

...