<h3>TLDR</h3>
<p><code>try/except</code>块确保程序继续运行,而不是突然结束。通过包含<code>except KeyError</code>,我们特别确保在发生<code>KeyError</code>时程序不会突然结束^如果<code>value</code>不是字典中的键,则{<cd4>}将抛出错误,因为它尝试访问不存在的键。<code>+=</code>使代码的运行方式类似于:</p>
<pre class="lang-py prettyprint-override"><code>result_dict[value] = result_dict[value] + 1
</code></pre>
<p>既然{<cd5>}不是结果,它类似于说</p>
<pre class="lang-py prettyprint-override"><code>result_dict[value] = None + 1
</code></pre>
<p>这很糟糕</p>
<h3>非TLDR版本</h3>
<p>当python中发生错误时,程序通常会突然终止并退出。它不会运行发生异常的部分下面的任何代码。例如,以下面的代码为例。它从用户<code>a</code>和<code>b</code>获取2个数字,并输出<code>a/b</code></p>
<pre class="lang-py prettyprint-override"><code>a = int(input("Enter a value for a: "))
b = int(input("Enter a value for b: "))
print("a/b is:", a/b)
</code></pre>
<p>如果用户提供了有效的输入(比如^{<cd11>),程序将顺利进行。但是,如果用户要给出,比如<code>a = "c"</code>,则会发生以下情况</p>
<pre><code>Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'c'
</code></pre>
<p>节目突然结束了。让程序以这样的方式结束是完全有效的,但您很少希望程序突然结束。以用户有1000个输入为例,最后一个输入出错。由于程序突然结束,用户必须重新启动程序并重新输入所有1000个输入</p>
<p>现在我们介绍一个<code>try/except</code>块。我们知道,将非数字字符转换为整数将抛出一个<code>ValueError</code>,如错误中所示,因此我们将相应地处理它们</p>
<pre class="lang-py prettyprint-override"><code>while True:
try:
a = int(input("Enter a value for a: "))
break
except:
print("An error has occurred. Please input a again")
while True:
try:
b = int(input("Enter a value for b: "))
break
except:
print("An error has occurred. Please input b again")
print("a/b is:", a/b)
</code></pre>
<p>现在,我们从用户那里获取一个输入,<strong>尝试将其转换为整数,并将该值放入<code>a</code>。如果成功,它将顺利进入下一行(<code>break</code>)并退出循环。如果失败,则将发生<strong>异常</strong>,并将进入<code>except</code>块,在该块中打印一条有用的错误消息,然后再次运行循环(直到用户输入有效的输入)。现在,程序不会在失败时突然终止。它向用户提供适当的反馈,并允许用户再次重试输入</p>
<p>这是一个通用异常块,您可以在其中捕获任何异常</p>
<p>但是现在让我们说,可能会发生多个错误。以下面的代码为例:</p>
<pre class="lang-py prettyprint-override"><code>a = input()
b = input()
print(int(a)/int(b))
print("I am done")
</code></pre>
<p>现在可能会出现一些错误。其中之一是上面提到的<code>ValueError</code>,其中给定的输入不能转换为整数。另一个错误是<code>ZeroDivisionError</code>,其中<code>b=0</code>。Python不喜欢除以零,因此它会抛出异常并立即终止程序</p>
<p>现在,您需要为每种类型的程序打印一条特殊消息。如何做到这一点是通过捕获特定异常来实现的</p>
<pre class="lang-py prettyprint-override"><code>a = input("Enter a value for a: ")
b = input("Enter a value for b: ")
try:
print(int(a)/int(b))
except ValueError:
print("We cannot convert a non-numeric character to an integer")
except ZeroDivisionError:
print("We cannot divide by 0")
except:
print("Some unexpected error has occurred")
print("I am done")
</code></pre>
<p>如果python无法将输入转换为整数,它将输入代码的<code>ValueError</code>块,并打印<code>"We cannot convert a non-numeric character to an integer"</code></p>
<p>如果python试图除以0,那么它将进入<code>ZeroDivisionError</code>块并打印<code>"We cannot divide by 0"</code></p>
<p>如果发生任何其他类型的错误,它将在最后的块和打印之外结束<code>"Some unexpected error has occurred"</code></p>
<p>处理完异常后,它会打印<code>"I am done"</code></p>
<p>请注意,如果最终的<code>except</code>块不在那里捕获任何其他异常,那么程序将不会很好地终止,因为该异常未经处理,并且不会打印最终语句</p>
<p>现在,人们如何认识到可能发生的错误?这取决于实践,一旦您熟悉了错误,就可以相应地处理它们。或者,有目的地让程序抛出异常,并读取堆栈跟踪以了解发生的异常类型。然后相应地处理它们。您不必以不同的方式处理每个特定错误,您可以以相同的方式处理所有错误</p>
<p>您可以在此处阅读更多内容:<a href="https://docs.python.org/3/tutorial/errors.html" rel="nofollow noreferrer">Python's documentation for errors and exceptions</a></p>