<p>提出<code>Exception</code>就像告诉医生“有什么不对劲”,然后拒绝回答任何问题。比较:</p>
<pre><code>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.
</code></pre>
<p>及</p>
<pre><code>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.")
</code></pre>
<p>如果您正在创建一个库,您可以在适当的地方使用预定义的异常类,但有时您需要传达Python创建者从未想到的错误,或者您需要比现有异常做更精细的区分。这是创建自定义异常的时间</p>
<p>例如,Django将定义<code>django.contrib.auth.models.User.DoesNotExist</code>异常,以告知代码试图在数据库中查找<code>User</code>,但找不到与给定条件匹配的<code>User</code>。能够捕捉<code>django.contrib.auth.models.User.DoesNotExist</code>就像是一名医生,让一名患者不仅告诉你什么是伤害,还带来X光片和打印的家族史</p>