2011-01-13 3 views
5

Когда вы используете каждый? Я считаю, что я использую, если намного больше, чем исключения. Похоже, что я уловил исключения, используя мои «ifs», прежде чем я их получу. Во всем моем коде есть ifs.Когда вы должны проверять наличие ошибок, используя «if», и когда вы должны использовать исключения?

+1

Это предложение было задано бесчисленное количество раз (2739582, 1152541, 1313812). Между этим вопросом, ваш вопрос 4557577 (и, несомненно, многие другие), и ваши в настоящее время более * восемьсот вопросов *, кажется, что вы что-то вопроса спамера. –

ответ

2

Try catch statements предназначен для обработки серьезных ошибок и, в частности, для подключения к внешним службам, таким как веб-служба, база данных, веб-запрос и т. Д., Где ошибки будут и должны произойти время от времени. Для обработки исключения более тяжело использовать среду выполнения, чем писать хороший код и использовать функции данного языка, такие как ifs или trernary.

попробовать уловы - это не первая линия обороны, это последняя строка, использующая защитные методы кодирования.

1

Особенно, поскольку вы работаете с большими приложениями, обработка исключений действительно является лучшей практикой. Как вы упомянули, вы получаете много утверждений if. С помощью python использование операторов try/except позволяет создать более стандартизованный способ устранения исключений. За исключением случаев, вы получите возможность увидеть тип класса исключений, а также любые другие пользовательские, которые вы создаете. Это просто дает вам гораздо более структурированный способ кодирования.

4

EAFP: Easier to ask for forgiveness than permission.

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

Это контрастирует с LBYL (Look before you leap) стиле, общие для многих других языков, таких как C.

Update 1

Конечно, вы должны убедиться, что вы обрабатывать любые пойманные исключения, а не просто молча игнорировать их в противном случае вы собираетесь тратить много времени на отладку! pass, вероятно, не то, что вы ищете!

Update 2

Вы должны поймать конкретные исключения, что вы ожидали быть raise -d, являются ли они built-in exceptions или иначе.

+0

Я поставил общую попытку: кроме Exceptione,: print e pass Является ли это oK? – TIMEX

+0

@TIMEX: здесь нет общего ответа. Как вы обрабатываете исключение, зависит от того, какую обработку вы делали, когда это было 'raise' -d. То, что 'pass' очень редко, вы хотите! – Johnsyweb

+1

Стоит отметить, что использование обработчиков исключений по отношению к операторам 'if' сообщает читателю вашего кода что-то о том, что вы ожидаете. Утверждение 'if' подразумевает, что существует значительная вероятность того, что условие будет либо« True », либо« False », а' try'/'except' подразумевает обработку крайних случаев. Таким образом, хотя EAFP может быть идиоматическим питоном, в данном случае есть место для интерпретации. Кроме того, вы почти никогда не должны использовать общий «кроме исключения». – Wilduck

2

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

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

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

  • try... finally блоков, что позволяет любое исключение распространяться, но уборка все перед (на многих языках, в том числе Python),
  • with заявление (специфичные для Python),
  • парадигма RAII, которая включает очистку в деструкторах (в основном C++).
Смежные вопросы