⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000007.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;yyh&nbsp;(一笑了之),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;第八章&nbsp;错误与例外&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Tue&nbsp;Jun&nbsp;20&nbsp;17:06:02&nbsp;2000)&nbsp;<BR>&nbsp;<BR>第八章&nbsp;错误与例外&nbsp;<BR>到现在为止我们只是提到了错误信息而没有详细讨论,如果你运行了前面的例子可能已&nbsp;<BR>经看到了一些错误信息。至少有两种不同错误:句法错和例外错(exceptions)。&nbsp;<BR>8.1&nbsp;句法错&nbsp;<BR> 句法错也称为语法分析错,是你在学习Python的时候最可能犯的错误。&nbsp;<BR>><I>&gt;&gt;&nbsp;while&nbsp;1&nbsp;print&nbsp;'Hello&nbsp;world'&nbsp;</I><BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;1&nbsp;print&nbsp;'Hello&nbsp;world'&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;<BR>SyntaxError:&nbsp;invalid&nbsp;syntax&nbsp;<BR>语法分析器重复出错行,并用一个小‘箭头’指向行内最早发现错误的位置。错误是由&nbsp;<BR>箭头前面的记号引起的(至少是在这里检测到的)。在本例中,错误在关键字print处检&nbsp;<BR>测到,因为它前面应该有一个冒号(“:”)。错误信息中显示了文件名和行号这样如果&nbsp;<BR>错误发生在一个脚本文件中你就知道到哪里去找。&nbsp;<BR>8.2&nbsp;例外&nbsp;<BR>即使语句或表达式句法没有问题,在试图运行的时候也可能发生错误。运行时检测到的&nbsp;<BR>错误叫做例外,这种错误不一定必然是致命的:你很快就会学到如何在Python程序中处&nbsp;<BR>理例外。然而,多数例外不能被程序处理,这是会产生错误信息,如:&nbsp;<BR>><I>&gt;&gt;&nbsp;10&nbsp;*&nbsp;(1/0)&nbsp;</I><BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>ZeroDivisionError:&nbsp;integer&nbsp;division&nbsp;or&nbsp;modulo&nbsp;<BR>><I>&gt;&gt;&nbsp;4&nbsp;+&nbsp;spam*3&nbsp;</I><BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>NameError:&nbsp;spam&nbsp;<BR>><I>&gt;&gt;&nbsp;'2'&nbsp;+&nbsp;2&nbsp;</I><BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>TypeError:&nbsp;illegal&nbsp;argument&nbsp;type&nbsp;for&nbsp;built-in&nbsp;operation&nbsp;<BR>错误信息的最后一行显示发生的情况。例外有不同的类型,类型作为错误信息的一部分&nbsp;<BR>显示:上例中错误的类型有ZeroDivisionError、NameError和TypeError。作为例外类型&nbsp;<BR>显示的字符串是发生的例外的内置名。这对于所有内置例外成立,但对用户自定义例外&nbsp;<BR>不一定成立(用户最好能遵守这样的约定)。标准例外名是内置的标识符(不是保留关&nbsp;<BR>键字)。&nbsp;<BR>此行的其余部分是错误的细节,其解释依赖于例外类型。错误信息前面的部分以堆栈反&nbsp;<BR>跟踪的形式显示了发生错误的上下文环境。一般这包含了列出源代码行的一个列出源程&nbsp;<BR>序行的堆栈反跟踪;然而,它不会显示从标准输入读进的行。&nbsp;<BR> 库参考手册列出了内置例外和其含义。 &nbsp;<BR>8.3&nbsp;例外处理&nbsp;<BR> 可以编程序来处理选定的例外。请看下面的例子,显示一些浮点数的倒数:&nbsp;<BR>><I>&gt;&gt;&nbsp;numbers&nbsp;=&nbsp;[0.3333,&nbsp;2.5,&nbsp;0,&nbsp;10]&nbsp;</I><BR>><I>&gt;&gt;&nbsp;for&nbsp;x&nbsp;in&nbsp;numbers:&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;x,&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;1.0&nbsp;/&nbsp;x&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;ZeroDivisionError:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'***&nbsp;has&nbsp;no&nbsp;inverse&nbsp;***'&nbsp;<BR>...&nbsp;<BR>0.3333&nbsp;3.00030003&nbsp;<BR>2.5&nbsp;0.4&nbsp;<BR>0&nbsp;***&nbsp;has&nbsp;no&nbsp;inverse&nbsp;***&nbsp;<BR>10&nbsp;0.1&nbsp;<BR>try语句是这样工作的:&nbsp;<BR>首先,运行try子句(在try和except之间的语句)。&nbsp;<BR>如果没有发生例外,跳过except子句,try语句运行完毕。&nbsp;<BR>如果在try子句中发生了例外错误而且例外错误匹配except后指定的例外名,则跳过try&nbsp;<BR>&nbsp;子句剩下的部分,执行except子句,然后继续执行try语句后面的程序。&nbsp;<BR>如果在try子句中发生了例外错误但是例外错误不匹配except后指定的例外名,则此例外&nbsp;<BR>被传给外层的try语句。如果没有找到匹配的处理程序则此例外称作是未处理例外,程序&nbsp;<BR>停止运行,显示错误信息。&nbsp;<BR>try语句可以有多个except子句,为不同的例外指定不同处理。至多只执行一个错误处理&nbsp;<BR>程序。错误处理程序只处理相应的try子句中发生的例外,如果同try语句中其它的错误&nbsp;<BR>处理程序中发生例外错误处理程序不会反应。一个except子句可以列出多个例外,写在&nbsp;<BR>括号里用逗号分开,例如:&nbsp;<BR>...&nbsp;except&nbsp;(RuntimeError,&nbsp;TypeError,&nbsp;NameError):&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass&nbsp;<BR>最后一个except子句可以省略例外名,作为一个通配项。这种方法要谨慎使用,因为这&nbsp;<BR>可能会导致程序实际已出错却发现不了。&nbsp;<BR>try&nbsp;...&nbsp;except语句有一个可选的else子句,如有的话要放在所有except子句之后。el&nbsp;<BR>se&nbsp;的意思是没有发生例外,我们可以把try子句中没有发生例外时要做的事情放在这个&nbsp;<BR>子句里。例如:&nbsp;<BR>for&nbsp;arg&nbsp;in&nbsp;sys.argv[1:]:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;try:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;open(arg,&nbsp;'r')&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;IOError:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'不能打开',&nbsp;arg&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;arg,&nbsp;'有',&nbsp;len(f.readlines()),&nbsp;'行'&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close()&nbsp;<BR>例外发生时可能伴有一个值,叫做例外的参数。参数是否存在及其类型依赖于例外的类&nbsp;<BR>型。对于有参数的例外,except在自居可以在例外名(或表)后指定一个变量用来接受&nbsp;<BR>例外的参数值,如:&nbsp;<BR>><I>&gt;&gt;&nbsp;try:&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spam()&nbsp;<BR>...&nbsp;except&nbsp;NameError,&nbsp;x:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'name',&nbsp;x,&nbsp;'undefined'&nbsp;<BR>...&nbsp;<BR>name&nbsp;spam&nbsp;undefined&nbsp;<BR>有参数的例外未处理时会在错误信息的最后细节部分列出其参数值。 &nbsp;<BR>例外处理程序不仅处理直接产生于try子句中的例外,也可以处理try子句中调用的函数&nbsp;<BR>(甚至是间接调用的函数)中的例外。如:&nbsp;<BR>><I>&gt;&gt;&nbsp;def&nbsp;this_fails():&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;1/0&nbsp;<BR>...&nbsp;<BR>><I>&gt;&gt;&nbsp;try:&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this_fails()&nbsp;<BR>...&nbsp;except&nbsp;ZeroDivisionError,&nbsp;detail:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'Handling&nbsp;run-time&nbsp;error:',&nbsp;detail&nbsp;<BR>...&nbsp;<BR>Handling&nbsp;run-time&nbsp;error:&nbsp;integer&nbsp;division&nbsp;or&nbsp;modulo&nbsp;<BR>8.4&nbsp;产生例外&nbsp;<BR>raise语句允许程序员强行产生指定的例外。例如:&nbsp;<BR>><I>&gt;&gt;&nbsp;raise&nbsp;NameError,&nbsp;'HiThere'&nbsp;</I><BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>NameError:&nbsp;HiThere&nbsp;<BR>raise语句的第一个参数指定要产生的例外的名字。可选的第二参数指定例外的参数。 &nbsp;<BR>&nbsp;<BR>8.5&nbsp;用户自定义例外&nbsp;<BR>程序中可以定义自己的例外,只要把一个字符串赋给一个变量即可。例如:&nbsp;<BR>><I>&gt;&gt;&nbsp;my_exc&nbsp;=&nbsp;'my_exc'&nbsp;</I><BR>><I>&gt;&gt;&nbsp;try:&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;my_exc,&nbsp;2*2&nbsp;<BR>...&nbsp;except&nbsp;my_exc,&nbsp;val:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'My&nbsp;exception&nbsp;occurred,&nbsp;value:',&nbsp;val&nbsp;<BR>...&nbsp;<BR>My&nbsp;exception&nbsp;occurred,&nbsp;value:&nbsp;4&nbsp;<BR>><I>&gt;&gt;&nbsp;raise&nbsp;my_exc,&nbsp;1&nbsp;</I><BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;1&nbsp;<BR>my_exc:&nbsp;1&nbsp;<BR>许多标准模块用这种方法报告自己定义的函数中发生的错误。 &nbsp;<BR>8.6&nbsp;定义清理动作&nbsp;<BR> &nbsp;try语句还有另一个finally可选子句,可以用来规定不论出错与否都要执行的动作。&nbsp;<BR>例如:&nbsp;<BR>><I>&gt;&gt;&nbsp;try:&nbsp;</I><BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;KeyboardInterrupt&nbsp;<BR>...&nbsp;finally:&nbsp;<BR>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'Goodbye,&nbsp;world!'&nbsp;<BR>...&nbsp;<BR>Goodbye,&nbsp;world!&nbsp;<BR>Traceback&nbsp;(innermost&nbsp;last):&nbsp;<BR>&nbsp;&nbsp;File&nbsp;&quot;&lt;stdin&gt;&quot;,&nbsp;line&nbsp;2&nbsp;<BR>KeyboardInterrupt&nbsp;<BR>finally子句不论try子句中是否发生例外都会执行。例外发生时,先执行finally子句然&nbsp;<BR>后重新提出该例外。当try语句用break或return语句退出时也将执行finally子句。&nbsp;<BR>要注意的是,try语句有了except子句就不能有finally子句,有了finally子句就不能有&nbsp;<BR>except&nbsp;子句,不能同时使用except子句和finally子句。需要的话可以嵌套。&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;162.105.17.22]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -