Повышение Exception
- это все равно, что сказать доктору "Что-то не так", а затем отказаться отвечать на любые вопросы. Сравните:
try:
with open("foo.json", "rt") as r:
new_count = json.load(r)["count"] + 1
except Exception:
# Is the file missing?
# Is the file there, but not readable?
# Is the file readable, but does not contain valid JSON?
# Is the file format okay, but the data's not a dict with `count`?
# Is the entry `count` there, but is not a number?
print("Something's wrong")
# I don't care. You figure it out.
и
try:
with open("data.json", "rt") as r:
new_count = json.load(r)["count"] + 1
except FileNotFoundError:
print("File is missing.")
except PermissionError:
print("File not readable.")
except json.decoder.JSONDecoderError:
print("File is not valid JSON.")
except KeyError:
print("Cannot find count.")
except TypeError:
print("Count is not a number.")
Если вы создаете библиотеку, вы можете использовать предопределенные классы исключений, где это уместно, но иногда вам нужно сообщить об ошибках, которые создали Python никогда не задумывались, или вам нужно провести более тонкое различие, чем существующие исключения. Это когда вы создаете пользовательское исключение.
Например, Django определит исключение django.contrib.auth.models.User.DoesNotExist
, чтобы сообщить, что код пытался найти User
в базе данных, но не User
соответствие заданным критериям может быть найдено. Возможность поймать django.contrib.auth.models.User.DoesNotExist
- это все равно, что быть врачом, и получить пациента, который не только говорит вам, что болит, но и приносит с собой рентген и напечатанную семейную историю.