Создание исключений стоит дорого в большинстве языков низкого уровня, таких как C ++.Это влияет на большую часть «общей мудрости» в отношении исключений и не так сильно применимо к языкам, которые работают в ВМ, например, к Python.В Python нет такой большой цены за использование исключения вместо условного.
(Это тот случай, когда «общая мудрость» становится привычной. Люди приходят к этому из опыта одного типаокружение - языки низкого уровня - и затем применить его к новым доменам, не оценивая, имеет ли это смысл.)
Исключения, как правило, все еще являются исключительными.Это не значит, что они случаются не часто;это означает, что они являются исключением.Это те вещи, которые, как правило, выходят за рамки обычного потока кода, и которые большую часть времени вам не нужно обрабатывать по одному - это точка обработки исключений.Эта часть в Python такая же, как в C ++ и во всех других языках с исключениями.
Однако, это имеет тенденцию определять, когда исключения брошены .Вы говорите о том, когда исключения должны быть пойманы .Проще говоря, не беспокойтесь об этом: исключения не являются дорогостоящими, поэтому не пытайтесь изо всех сил пытаться предотвратить их появление.Большая часть кода Python разработана вокруг этого.
Я не согласен с предложением Джона попытаться проверить и избежать исключений заранее.Хорошо, если это приведет к более четкому коду, как в его примере.Однако во многих случаях это просто усложнит ситуацию - это может привести к дублированию проверок и появлению ошибок.Например,
import os, errno, stat
def read_file(fn):
"""
Read a file and return its contents. If the file doesn't exist or
can't be read, return "".
"""
try:
return open(fn).read()
except IOError, e:
return ""
def read_file_2(fn):
"""
Read a file and return its contents. If the file doesn't exist or
can't be read, return "".
"""
if not os.access(fn, os.R_OK):
return ""
st = os.stat(fn)
if stat.S_ISDIR(st.st_mode):
return ""
return open(fn).read()
print read_file("x")
Конечно, мы можем проверить и избежать ошибки - но мы все усложнили.Мы пытаемся угадать все причины, по которым доступ к файлу может быть неудачным (и это не охватывает их все), возможно, мы представили условия гонки и выполняем гораздо больше работы по вводу / выводу.Это все сделано для нас - просто поймать исключение.