📄 node10.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <title>8. 程式错误与例外(Exceptions)情形</title> <meta name="description" content="8. 程式错误与例外(Exceptions)情形 "> <meta name="keywords" content="tut"> <meta name="resource-type" content="document"> <meta name="distribution" content="global"> <link rel="STYLESHEET" href="tut.css"> <link rel="next" href="node11.html"> <link rel="previous" href="node9.html"> <link rel="up" href="tut.html"> <link rel="next" href="node11.html"></head> <body> <div class="navigation"><table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node9.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node11.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody></table> <b class="navlabel">Previous:</b> <a class="sectref" href="node9.html">7.输入(Input)与输出(Output)</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python 教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node11.html">9. 类别(Classes)</a> <br><hr></div> <!--End of Navigation Panel--> <!--Table of Child-Links--> <a name="CHILD_LINKS"><strong>Subsections </strong></a> <ul> <li><a name="tex2html339" href="node10.html#SECTION0010100000000000000000">8.1 语法错误 </a> </li> <li><a name="tex2html340" href="node10.html#SECTION0010200000000000000000">8.2 例外(Exceptions)情形 </a> </li> <li><a name="tex2html341" href="node10.html#SECTION0010300000000000000000">8.3 例外(Exceptions)情形的处理 </a> </li> <li><a name="tex2html342" href="node10.html#SECTION0010400000000000000000">8.4 如何引发例外(Exceptions) </a> </li> <li><a name="tex2html343" href="node10.html#SECTION0010500000000000000000">8.5 自制一个例外情形 </a> </li> <li><a name="tex2html344" href="node10.html#SECTION0010600000000000000000">8.6 定义善后的动作 </a> </li></ul> <!--End of Table of Child-Links--> <hr> <h1> <br> 8. 程式错误与例外(Exceptions)情形 </h1> <p> 至此为止,我们都只有稍稍的提到错误讯息。但是如果你有试着执行上面的范例的话,你可能注意到,基本上错误的情况可以分成两类:语法错误 ( <i>syntax errors</i> ) 以及例外情况 ( <i>exceptions</i> )。 </p><p> </p><h1> <br> 8.1 语法错误 </h1> <p> 语法错误也叫做分析时的错误(parsing errors),大概是一般在学Python时最常见到的直译器所发出来的抱怨: </p><p> </p><dl><dd><pre class="verbatim">>>> while 1 print 'Hello world'<br> File "<stdin>", line 1<br> while 1 print 'Hello world'<br> ^<br>SyntaxError: invalid syntax<br></pre> </dd> </dl> <p> Python分析器(parser)会在印出错误的行,并且用一个向上的箭号指出最早发现错误的地方,而这个错误是发生(至少是被发现)在这个箭号所指的单元(token)<i>之前</i>。在我们的例子里面:错误发生在 <tt class="keyword">print</tt> 这个关键字,因为前面应该有一个 ( "<tt class="character">:</tt>" ) 。错误信息里面也包含档案名称以及行数,所以你可以很快知道要到哪里去找错。 </p> <p> </p> <h1> <br> 8.2 例外(Exceptions)情形 </h1> <p> 有的时候,甚至当你的语法完全正确时,当你执行程式时仍然会出错。这种在程式执行阶段发生的错误叫做例外情形 ( <i>exceptions</i> ) ,并且会造成程式致命的终止(无法执行下去)。你待会就会知道在Python里面要怎样处理这样的状况,但是我们先来看这样的状况下会造成什么错误信息: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> 10 * (1/0)<br>Traceback (innermost last):<br> File "<stdin>", line 1<br>ZeroDivisionError: integer division or modulo<br>>>> 4 + spam*3<br>Traceback (innermost last):<br> File "<stdin>", line 1<br>NameError: spam<br>>>> '2' + 2<br>Traceback (innermost last):<br> File "<stdin>", line 1<br>TypeError: illegal argument type for built-in operation<br></pre> </dd> </dl> <p> 在这些错误信息的最后一行都是解释到底发生了什么事。例外情况(Exception)有很多种类型,类型的名称也在错误信息之中,在上面的例子里面,exception的类型分别是: <tt class="exception">ZeroDivisionError</tt>, <tt class="exception">NameError</tt> 以及 <tt class="exception">TypeError</tt>. 。对于内建的exception来说,这些印出来的字串都是这些内建的exception类型的真正类型名称,但是对于使用者自己自定的exception类型就不一定了(虽然这是一个有用的约定俗成的习惯)。这些标准的exception名称也正是他们内建的指称(identifiers)(不是正式的关键字)。 </p> <p> 这一行其他部分则是有关这个exception类型的详细解释,其意义则是依照exception的类型而有不同。 </p> <p> 在错误信息最后一行之前的部分则是显示了这个exception发生时的状况,也就是记忆体堆积(stack)的内容追朔(backtrace)。一般来说这个这个部分包含了stackbacktrace的来源行数,但是这并不代表是在从标准输入读入时候的行数。 </p> <p> 在Python程式库参考手册中( <i>Python Library Reference</i> )详细列出了所有的内建exception及其说明。 </p> <p> </p> <h1> <br> 8.3 例外(Exceptions)情形的处理 </h1> <p> 我们可以写一个程式来处理某些的exception。请看下面程式范例,我们要求使用者输入一个有效的数字,直到所输入的数字真正有效为止。但是使用者也可以中止这个程式(用 <kbd>Control-C</kbd> 或者是任何作业系统支援的方式)。值得注意的是,使用者主动中止程式事实上是使用者引发一个 <tt class="exception">KeyboardInterrupt</tt> 的exception。 </p> <p> </p> <dl> <dd><pre class="verbatim">>>> while 1:<br>... try:<br>... x = int(raw_input("Please enter a number: "))<br>... break<br>... except ValueError:<br>... print "Oops! That was no valid number. Try again..."<br>...<br></pre> </dd> </dl> <p> 这个 <tt class="keyword">try</tt> 叙述的作用如下: </p> <p> </p> <ul> <li>首先,try之后的叙述( <i>try clause</i> ,在 <tt class="keyword">try</tt> 及 <tt class="keyword">except</tt> 这两个字之中所有的叙述)都会被执行。 <p> </p> </li> <li>如果没有发生任何exception, except之后的叙述( <i>except clause</i> )会自动被忽略,整个 <tt class="keyword">try</tt> 叙述就算是执行完毕。 <p> </p> </li> <li>如果当执行try之后的叙述时发生了exception,错误地方之后的叙述就不会被执行。然后如果这个exception的类型有某一个适合的 <tt class="keyword">except</tt> 关键字之后的类型的话,就会执行这一个except之后的叙述,然后程式从整个 <tt class="keyword">try</tt> 叙述之后的地方开始执行。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -