Вы должны предпочесть try/except
, чем if/else
, если это приведет к ускорению
- (например, путем предотвращения дополнительных поисков)
- более чистый код (меньше строк / прощечитать)
Часто они идут рука об руку.
ускорения
В случаепопытка найти элемент в длинном списке с помощью:
try:
x = my_list[index]
except IndexError:
x = 'NO_ABC'
попытка, за исключением того, что это лучший вариант, когда index
, вероятно, находится в списке, а ошибка IndexError обычно не вызывается.Таким образом, вы избегаете необходимости дополнительного поиска с помощью if index < len(mylist)
.
Python поощряет использование исключений, , с которыми вы работаете - это фраза из Погружение в Python .Ваш пример не только обрабатывает исключение (изящно), вместо того, чтобы позволить ему молча передавать , но и исключение происходит только в исключительном случае отсутствия индекса (отсюда и слово * 1035)* исключение !).
код очистителя
В официальной документации Python упоминается EAFP : Проще спроситьпрощение, а не разрешение и Роб Найт отмечает, что перехват ошибок вместо их избежания может привести к более чистому и легкому чтению кода.В его примере это выглядит так:
Хуже (LBYL 'посмотри, прежде чем прыгнешь') :
#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit:
return None
elif len(s) > 10: #too many digits for int conversion
return None
else:
return int(str)
Лучше (EAFP: Проще спроситьпрощение, чем разрешение) :
try:
return int(str)
except (TypeError, ValueError, OverflowError): #int conversion failed
return None