<p>首先,捕捉异常的方式是无效的。表达式<code>ValueError or TypeError</code>的值总是<code>ValueError</code>,因为对于两个非<code>False</code>参数,短路就是这样工作的。要获得两种类型的错误来触发块,请使用<code>tuple</code>,如<code>(ValueError, TypeError)</code>。你知道吗</p>
<p>问题是,即使在代码中捕获到异常,它也会继续进入<code>if</code>块。您有四个简单的选择来避免这种情况:</p>
<ol>
<li><p>在<code>except</code>块中使用<code>continue</code>语句告诉循环继续,而不处理以下<code>if</code>结构:</p>
<pre>
try:
guess = float(input("Please guess a number between 0 and 100: "))
except (ValueError, TypeError):
print ("That isn't even a number!")
<b>continue</b>
</pre>
<p>这可能是四个选项中最干净、最简单的。</p></li>
<li><p>不要使用<code>except</code>块来响应错误。相反,依赖于这样一个事实:guess的值仍然是<code>""</code>。要使其工作,您必须在循环的每次迭代中预先初始化<code>guess</code>,而不是在循环外初始化一次:</p>
<pre>
while guess != number:
<b>guess = ""</b>
try:
guess = float(input("Please guess a number between 0 and 100: "))
except (ValueError, TypeError):
<b>pass</b>
<b>
if guess == "":
print ("That isn't even a number!")
elif</b> guess < number and guess >= 0:
...
</pre>
<p>我个人并不喜欢这种方法,因为它需要在每个循环中进行初始化。这还不错,只是没有选项1那么干净。你知道吗</p>
<p>此选项的一个变体是直接检查<code>guess</code>是否是<code>str</code>的实例。然后可以将其初始化为用户输入,从而使转换操作更简洁:</p>
<pre>
while guess != number:
<b>guess = input("Please guess a number between 0 and 100: ")</b>
try:
guess = float(<b>guess</b>)
except (ValueError, TypeError):
<b>pass</b>
<b>
if isinstance(guess, str):
print ("That isn't even a number!")
elif</b> guess < number and guess >= 0:
...
</pre></li>
<li><p>使用<code>else</code>子句,它是<code>try</code>块的可能元素之一。如果未发生异常,则只执行<em></em>:</p>
<pre>
try:
guess = float(input("Please guess a number between 0 and 100: "))
except (ValueError, TypeError):
print ("That isn't even a number!")
<b>else:</b>
<b>if guess < number and guess >= 0:</b>
...
</pre>
<p>虽然这个选项创建了一个附加的缩进层,但是对于那些普通的<code>continue</code>不起作用的情况,有必要记住这个选项。有时,当您需要在分支之前对错误和非错误情况进行额外处理时,会发生这种情况。</p></li>
<li><p>将整个<code>if</code>块放入<code>try</code>块。这样,只有在没有错误的情况下才会执行。这是我最不喜欢的选项,因为我喜欢我的<code>try</code>块被尽可能地修剪,以避免捕获我不想捕获的异常。在Python中,<code>try</code>相对于Java这样的语言来说,性能杀手的作用相对较小,因此对于简单的情况,这仍然是一个选项:</p>
<pre>
try:
guess = float(input("Please guess a number between 0 and 100: "))
<b>if guess < number and guess >= 0:</b>
...
except (ValueError, TypeError):
print ("That isn't even a number!")
</pre></li>
</ol>