python 显示python 无效语法法

查看:7666|回复:5
初级工程师
在运行或编写一个程序时常会遇到错误异常,这时python会给你一个错误提示类名,告诉出现了什么样的问题(Python是面向对象语言,所以程序抛出的异常也是类)。能很好的理解这些错误提示类名所代表的意思,可以帮助你在最快的时间内找到问题所在,从而解决程序上的问题是非常有帮助的。
搜集了一些python最重要的内建异常类名,并做了简单的介绍:
AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
NameError:试图访问的变量名不存在
SyntaxError:语法错误,代码形式错误
Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。
IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误
KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引
TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。
助理工程师
谢谢分享,收藏了.知其然,知其所以然.才能快速有效解决.
初级工程师
引用:原帖由 qinzaoxiaozhu 于
11:55 发表
谢谢分享,收藏了.知其然,知其所以然.才能快速有效解决. 基础掌握好,处理问题才能事半功倍
初级工程师
初级工程师
引用:原帖由 ForDream_Xin 于
17:21 发表
感谢分享,已收藏学习下用惨痛的经历告诉你Python奇葩语法:代码缩进不是为了排版
用惨痛的经历告诉你Python奇葩语法:代码缩进不是为了排版
[摘要]鉴于没有全面学习Python语法,就直接使用Python语言编程,被Python的潜规则给狠狠的打了一巴掌。不过,最后发现问题,也是一番探索得来,虽然辛苦,但是也很快乐。Python的缩进并不是为了排版哦。 今天要来说一下Python的一个语法规定,那就是代码缩进。今天被这个坑了一阵子,所以来说说经过。 因为项目需要,接触到了Python。然而我不得不吐槽一下Python。
我现在做的后台服务器,使用C++写的核心库,然后透接给Python调用。我们服务器的架构是Nginx+uwsgi+Python+C++。 服务器的基本结构就是:C++写服务器核心功能库,Nginx作为服务器,来接受请求,然后借助插件uwsgi来支持web。为什么用Nginx呢?因为Nginx的高并发性能比Apache强10倍。Nginx将请求传递给uwsgi来处理web。作为Web服务器,必然需要一个后台处理语言程序来处理web请求。Asp.net后台可以是VB脚本也可以是C#。PHP后台则是php。我们这里的Nginx后台选择的是Python。Python、php、VB脚本一样,都是脚本语言。而C#则是编译型语言。所以在后台处理web的请求,uwsgi将Nginx转发过来的请求,做一个处理,然后再传递给Python脚本文件处理。Python脚本文件以py结尾,处理后会生成pyc文件,算是编译过的脚本文件。然后Python就可以和C++提供的库直接对接,Python调用C++导出的库函数,来完成核心功能。也就是说,Python只是做web的逻辑处理,真正的核心功能,都在C++程序里。 这样的架构,你感觉到了什么?哈哈哈,C++也是可以做网站滴,而且这样的架构,性能非常强悍!现在大服务器很多都采用Nginx了,再加上C++代码的高效,简直太赞了。是不是又一次感受到C++的用武之地了呢?! 好了,现在要是的就是Python处理的逻辑。Python处理Web逻辑,然后直接输出结果html结果,从而实现网页的动态交互。Python是脚本语言,所以工作机制和PHP是一样的。Python和PHP都是解释性语言,读取一条代码,执行一条代码,只要前面的是正确的就可以正确的执行,直到遇到Bug再崩溃。而asp.net的程序,则是编译型的,和C++一样的,需要提前编译好,所有代码没有语法错误才行。 然后今天发现一个问题,就是添加数据的时候,网页崩溃了,错误提示为500,即服务器内部错误,也就是服务器端的程序错误。咋一看,应该是代码问题。所以,就开始着手干了。 因为问题是从前端网页发生的,所以,为了定位问题,先去定位产生问题的位置,也就是一个按钮提交数据,然后结果服务器程序崩溃。所以,就去找按钮,然后定位到提交数据的js代码,然后再定位到js代码中提交的函数,根据函数名,确定了后台的Python页面文件,即py结尾的文件。 从这一步开始,前后台就链接起来了,可以进行联调,即同时看前端页面和后台这个页面的程序。通过火狐浏览器的web开发人员工具的调试器,和VS一样打断点,然后F10一步步的单步跟进,确定了传递的参数,发现和修改及删除的参数一样,所以排除问题。问题不再前端,即前端提交的数据是正确的。 然后就是跟进后台的Python程序。在网站后台,要想调试,可不能向前台一样在浏览器调试,而且是在线运行状态,不太好搞。这和linux开发的嵌入式程序一样,不方便调试。所以大家通常用的一种方法就是打日志。将相关信息自己加写日志的代码写到文件中去,然后从文件中去查看各个代码的执行情况。这一方法非常的有用。我们在VS开发的时候,那调试功能太强大了,对于开发来说,极大提高了开发效率。而此时只能用日志方式调试了。 好吧,既然要写日志,那就要在Python文件中加代码。python写文件的代码,并不难,你不会,随便在网上查一下资料,就有了。而且,函数用法和C语言差不多。其实我并没有去学过Python,而只是看着Python的现有代码去推测语法,然后仿照着些,然后一些特定的函数,就查一下。就这样写好了代码,加到了python代码中。然后保存,测试。 回到网页,因为之前报的错,提供了一个返回主页的按钮,然后就回了主页。主页有一个图表走势控件,会定期刷新,从后台取数据,也就要执行一下刚改的页面的程序。这样一进入主页,挂了,也是500的服务器程序错误。这让我好郁闷,明明代码都是正确的,竟然出现这样的问题。我以为是代码哪里不对,然后将写入文件的内容固定,不用参数,然后保存,还是挂了。好吧,那我再将写文件的函数直接注释了,回去看,还是挂了。然后我直接将写日志的代码都撤了,恢复原样,结果正常了。 我看了几遍网上的资料,代码真的没有错哦。这让我情何以堪。我百思不得其解,但是问题必须解决。虽然已经下班了,但是问题不解决,不想下班。 然后我静静的看,就看着,死死的看着这些代码,就不信看不出来。然后我继续仿照原有的代码来写吧。现在连缩进也仿照,所以,代码和原有代码对齐。然后看看效果,反正此时也没有其他办法,试试看。然后回去看主页,正常!当然,此时那个提交数据的页面还是有问题。主页导致的不正常是一个插曲。 这样有了效果,我再故意将代码又不对齐,然后再看效果,果不其然,主页又挂了。然后我就感觉到,Python中,缩进不一般呀。然后再后面的调试中,遇到缩进的时候,都和原有代码一样缩进。主页就没有出现问题,这样我有一种深深的探索的喜悦。偶尔在粘贴一行代码的时候,少了一个空格,也就没有对齐,竟然报错。此时的我已经很淡定,迅速对齐后,没有问题了。 Python这个对齐问题,耽误了一些时间。然后再后续调试完后,下班回来,吃完饭,已经是晚上9点了。然后回来后,我迅速去求证一个问题,那就Python的缩进问题。我可以推测,Python的缩进是作为语法规则的一部分,而不是C/C++那样的一个排版而已。 然后查询到的解释是:“Python中,是通过代码的缩进,来决定代码的逻辑的。通俗的说,Python中的代码的缩进,不是为了好看,而是觉得代码的含义,上下行代码之间的关系。缩进弄错了,就会导致程序出错,执行结果变成不是你想要的了。”。这样的解释,和我遇见的现象完全一致,和我推测的一样。 所以我不得不感慨到,Python语法真是奇葩,如果不注意,绝对会坑死你。当然,这是会像我这样的,没有全面去学习Python语法,而直接使用Python的人,才会遇到。当然,不排除习惯了C/C++的语法,刚开始学习Python的人也会遇到。而我用惨痛的经历验证了这一个语法。相信我要很久到不会忘记这个语法吧。 至于提交数据那个问题,我另外写一篇文章来解释,后面证明是一个数据库引发的问题,而且,这个问题绝对是你意想不到的问题,所以,也让我很意外。
热门文章HOT NEWS
大家对痛风最深刻的认识就是「疼痛」,但是高尿酸、痛风远不止关节痛。它还可以导致关节功能受损,肾脏损害,加重糖尿病病情,增
HOT ARTICLESPython 错误和异常小结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Python 错误和异常小结
上传于|0|0|文档简介
&&Python 错误和异常小结
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩10页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢欢迎访问, 您的支持就是我前进的动力.
[PYTHON] 核心编程笔记之十-Python错误和异常
10.1 什么是异常
10.1.1 错误
错误时语法或是逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译
当Python检测到一个错误时,解释器就会支出当前流已经无法继续执行下去,这时就出现了异常
10.1.2 异常
10.2 Python中的异常
NameError: 尝试访问一个未声明的变量
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
NameError: name 'foo' is not defined
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
ZeroDivisionError: integer division or modulo by zero
Python解释器语法错误:
&File "&stdin&", line 1
SyntaxError: invalid syntax
请求的索引超出序列范围:
&&& aList = []
&&& aList[0]
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
IndexError: list index out of range
请求一个不存在的字典关键字:
&&& aDict = {'host':'earth','port':80}
&&& print aDict['server']
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
KeyError: 'server'
输入/输出错误
&&& f = open('haha')
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
IOError: [Errno 2] No such file or directory: 'haha'
尝试访问未知的对象属性
&&& class myClass(object):
... & pass
&&& myInst = myClass()
&&& myInst.bar = 'spam'
&&& myInst.bar
&&& myInst.foo
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
AttributeError: 'myClass' object has no attribute 'foo'
10.3 检测和处理异常:
异常可以通过try语句来检测,任何在try语句块里的代码都会被检测,检查有无异常发生
try语句有两种形式:
try-except和try-finally
一个try语句可以对应一个或多个except子句,但只能对应一个finally子句,或一个try-except-finally复合语句
10.3.1 try-except 语句
& &try_suite # watch for exceptions here 监控这里的异常
except Exception[,reason]:
& &except_suite & # exception-handling code 异常处理代码
... & & f = open('haha','r')
... except IOError,e:
... & & print 'could not open file:',e
could not open file: [Errno 2] No such file or directory: 'haha'
10.3.2 封装内建函数
&&& float(12345)
&&& float('12345')
&&& float('123.45e67')
1.2345e+69
&&& float('foo') & & &
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
ValueError: could not convert string to float: foo
&&& float(['this is',1,'list'])
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
TypeError: float() argument must be a string or a number
如果参数类型正确,但值不可转换为浮点数,那么将引发ValueError异常
安全的调用float()函数:
我们创建一个封装函数,safe_float(),第一次改进中我们搜索并忽略ValueError
&&& def safe_float(obj):
... & & try:
... & & & &return float(obj)
... & & except ValueError:
... & & & &pass
&&& safe_float('haha')
&&& safe_float('123')
以上不足在于出现错误无返回任何信息,我们至少应该显式的返回None
&&& def safe_float(obj):
... & & try:
... & & & &retval = float(obj)
... & & except ValueError:
... & & & &retval = 'None'
... & & return retval
&&& safe_float('123')
&&& safe_float('haha')
&&&def safe_float(obj):
... & & try:
... & & & &retval = float(obj)
... & & except ValueError:
... & & & &retval = 'could not convert non-number to float'
... & & return retval
&&& safe_float('123')
&&& safe_float('bad input')
'could not convert non-number to float'
但如果传递一个非法对象,还是会出问题
&&& safe_float({'a':'Dict'})
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
&File "&stdin&", line 3, in safe_float
TypeError: float() argument must be a string or a number
10.3.3 带有多个except的try语句
except Exception1[, reason]:
& &suite_for_exception_Exception1
except Exception2[, reason]:
& &suite_for_exception_Exception2
&&& def safe_float(obj):
... & & try:
... & & & & retval = float(obj)
... & & except ValueError:
... & & & & retval = 'could not convert non-number to float'
... & & except TypeError:
... & & & & retval = 'object type cannot be converted to float'
... & & return retval
使用错误的参数调用这个函数:
&&& safe_float('xyz')
'could not convert non-number to float'
&&& safe_float(())
'object type cannot be converted to float'
&&& safe_float(200L)
&&& safe_float(45.67000)
10.3.4 处理多个异常的except语句:
except (Exception1,Exception2)[, reason]:
& &suite_for_exception_Exception1_and_Exception2
except (Exc1[,Exc2[, ... ExcN]])[, reason]:
& &suite_for_exceptions_Exc1_and_ExcN
要求safe_float()函数中的所有异常必须使用同样的代码:
&&& def safe_float(obj):
... & &try:
... & & & retval = float(obj)
... & &except(ValueError,TypeError):
... & & & retval = 'argument must be a number or numeric string'
... & &return retval
现在,错误的输出会返回相同字符串:
&&& safe_float('Spanish Inquisition')
'argument must be a number or numeric string'
&&& safe_float([])
'argument must be a number or numeric string'
&&& safe_float('1.6')
&&& safe_float(1.6)
&&& safe_float(932)
10.3.5 捕获所有异常:
except Exception,e:
& &# error,occurred,log 'e',etc
except Exception,e:
& &# error,occurred,etc.
捕获Python需要退出的异常:
except(KeyboardInterupt,SystemExit):
& &# user wants to quit
& &raise # reraise back to caller
except Exception:
& &# handle real errors
当你有了一个Exception处理器后,你不必为这两个异常创建额外的处理器
except Exception,e:
& &# handle real errors
如果你确实需要捕获所有异常,那么你就得使用新的BaseExcption:
except BaseException,e:
& &# handle all errors
注: 不要处理并忽略所有错误
& &large_block_of_code #bandage of large piece of code
except Exception: # same as except:
& &pass # blind eye ignoring all errors
10.3.6 异常参数:
# single exception
except Exception[, reason]:
& &suite_for_Exception_with_Argument
# multiple exceptions
except (Exception1,Exception2,...,ExceptionN)[, reason]:
& &suite_for_Exception1_to_ExceptionN_wih_Argument
例:传参给内建float函数一个无效对象,引发TypeError异常:
... & & float(['float() does not','like lists', 2])
... except TypeError,diag: # capture diagnostic info
... & & pass
&&& type(diag)
&type 'exceptions.TypeError'&
&&& print diag
float() argument must be a string or a number
我们首先在一个try语句块中引发一个异常,随后简单的忽略了这个异常,但保留了错误的信息,调用内置type()函数,我们可以确认我们的异常的确是TypeError异常类的实例,最后我们队异常诊断参数调用print以显示错误
为了获取更多关于异常的信息,我们可以调用该实例的__class__属性,它标示了实例是从什么类实例化而来,类对象也有属性
TypeError('float() argument must be a string or a number',)
&&& diag.__class__
&type 'exceptions.TypeError'&
&&& diag.__class__.__doc__
'Inappropriate argument type.'
&&& diag.__class__.__name__
'TypeError'
我们用字符串化(string representation)的异常参数来替换单一的错误信息
&&& def safe_float(object):
... & &try:
... & & & retval = float(object)
... & &except(ValueError, TypeError), diag:
... & & & retval = str(diag)
... & &return retval
当我们提供的safe_float()参数给的不恰当时,虽然只有一条捕获语句,但可以获得如下信息:
&&& safe_float('xyz')
'could not convert string to float: xyz'
&&& safe_float({}) &
'float() argument must be a string or a number'
10.3.7 在应用使用我们封装的函数:
我们将在一个迷你应用中特地的使用这个函数,它将打开信用卡交易数据文件,加载所有交易,包括解释的字符串,下面是一个示例的carddate.txt文件:
# cat carddata.txt
# carddata.txt previous balance
finance charge/late fees
# vi cardrun.py
----------------------------
#!/usr/bin/env python
def safe_float(obj):
& &'safe version of float()'
& & & &retval = float(obj)
& &except(ValueError,TypeError),diag:
& & & &retval = str(diag)
& &return retval
def main():
& &'handles all the data processing'
& &log = open('cardlog.txt','w')
& & & &ccfile = open('carddata.txt','r')
& &except IOError,e:
& & & &log.write('no txns this month\n')
& & & &log.close()
& & & &return
& &txns = ccfile.readlines()
& &ccfile.close()
& &total = 0.00
& &log.write('accout log:\n')
& &for eachTxn in txns:
& & & &result = safe_float(eachTxn)
& & & &if isinstance(result,float):
& & & & & &total += result
& & & & & &log.write('data... processed\n')
& & & &else:
& & & & & &log.write('ignored: %s' %result)
& &print '$%.2f(new balance)' % (total)
& &log.close()
if __name__ == '__main__':
----------------------------
# python cardrun.py
-------------------------
$58.94(new balance)
---------------------------
# cat cardlog.txt
------------------------------ &
accout log:
ignored: could not convert string to float: # carddata.txt previous balance
data... processed
ignored: could not convert string to float: debits
data... processed
data... processed
data... processed
ignored: could not convert string to float: credits
data... processed
data... processed
ignored: could not convert string to float: finance charge/late fees
data... processed
data... processed
ignored: could not convert string to float:
----------------------------------
10.3.8 else 子句
在try范围中没有异常被检测到时,才会执行else子句
import 3rd_party_module
log = open('logfile.txt','w')
& &3rd_party_module.function()
& &log.write("*** caught exception in module\n")
& &log.write("*** no exception caught\n")
log.close()
10.3.9 finally子句
try-except-else-finally语法示例:
except MyException: B
finally: D
10.3.10 try-finally语句:
无论try中是否有异常触发,finally代码段都会被执行
& &try_suite
& &finally_suite # 无论如何都执行
当在try范围中产生一个异常时,会立即跳转到finally语句段,当finally所有代码执行完毕,才会继续向上一层引发异常
& &cofile = open('carddata.txt')
except IOError:
& &log.write('no txns this month\n')
txns = cofile.readlines()
ccfie,close
但有很多原因会导致readlines()失败,其中一种就是carddata.txt存在于网络(或软盘上),本身介质的不稳定导致不能稳定读取
我们可以把这一小段读取数据的代码整个放入try子句范围中:
& &cofile = open('carddata.txt')
& &txns = cofile.readlines()
& &ccfie.close
except IOError:
& &log.write('no txns this month\n')
如果出于一些原因readlines()调用失败,异常处理会去继续执行except中的子句,从而不会去关闭文件(ccfie.close)
如何在出现错误后,仍旧可以关闭文件,我们可以通过try-finally来实现:
ccfile = None
& & &cofile = open('carddata.etc')
& & &txns = cofile.readlines()
& & &ccfie.close
&except IOEorror:
& & &log.write('no txns this month\n')
& &if ccfile:
ccffle.close()
以下代码本质与之前干的同样的工作,区别在于关闭文件发生在异常处理器将错误写入日志之前,这是因为finally会自动重新引发异常
ccfile = None
& & &cofile = open('carddata.etc')
& & &txns = cofile.readlines()
& & &if ccfile:
& & &ccffle.close()
except IOError:
& & &log.write('no txns this month\n')
10.3.11 try-except-else-finally
& &try_suite
except Exception1:
& &suite_for_Exception1
except (Exception2,Exception3,Exception4):
& &suite_for_Exceptions_2_3_and_4
except Exception5,Argument5:
& &suite_for_excetion5_plus_argument
except (Exception6,Exception7),Argument67:
& &suite_for_excetion6_and_7_plus_argument
& &suite_for_all_other_exceptions
& &no_exceptions_detected_suite
& &always_execute_suite
10.4 上下文管理
10.4.1 with语句
with context_expr [as var]:
& &with_suite
with open('/etc/passwd','r') as f:
& &for eachLine in f:
# ...do stuff with eachLine or f...
10.4.2 *上下文管理协议
10.5 *字符串作为异常
10.6 触发异常
到目前为止,我们所见到的异常都是由解释器引发的,由于执行期间的错误而引发,程序员在编写API时也希望在遇到错误的输入时触发异常,为此,Python提供了一种机制让程序员明确的触发异常:这就是raise语句:
10.6.1 raise语句
raise [SomeException [, args[, traceback]]]
raise语句的用法
rasie 语法描述
raise exclass触发一个异常,从exclass生成一个实例(不含任何异常参数)
raise exclass()同上,除了现在不是类;通过函数调用操作符作用于类名生成一个新的exclass实例,同样也没有异常参数
raise exclass,args同上,但同时提供的异常参数args,可以是一个参数也可以元祖
raise exclass(args)同上
raise exclass,args, tb同上,但提供一个追踪对象tb供使用
raise exclass,instance通过实例触发异常
raise instance通过实例触发异常
raise string触发字符串异常
raise string,args触发伴随着args
raise string,args,tb同上,但提供一个追踪对象tb供使用
raise重新触发前一个异常,如果之前没有异常,触发TypeError
断言是一句必须等价于布尔真的判定,此外,发生异常也意味着表达式为假
可以理解为是raise-if-not语句,如果返回值是假,触发异常
10.7.1 断言语句
assert expression[, arguments]
assert用法:
assert 1 == 1
assert 2 +2 == 2 * 2
assert len(['my list', 12]) & 10
assert range(3) == [0, 1, 2]
AssertionError异常和其他异常一样可以用try-except语句块捕捉,如果没有捕捉,它将终止程序运行而且提供一个如下的traceback:
&&& assert 1 == 0
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
AssertionError
我们可以提供一个异常参数给我们的assert命令:
&&& assert 1 == 0 , 'One dose not equal zero silly!'
Traceback (most recent call last):
&File "&stdin&", line 1, in &module&
AssertionError: One dose not equal zero silly!
用try-except语句捕获AssertionError异常:
... & & assert 1 == 0, 'One does not equal zero silly!'
... except AssertionError,args: & & & & & & & & & & &
... & & print '%s: %s' %(args.__class__.__name__, args)
AssertionError: One does not equal zero silly!
def assert(expr, args=None):
& &if __debug__ and not expr:
raise AssertionError,args
10.8 标准异常:
表10.2 列出了所有的Python当前的标准异常集,所有的异常都是内建的,所以它们在脚本启动前或在互交命令行提示符出现时已经是可用的了
表10.2 Python内建异常
10.9 创建异常:
--------------------------------------
#!/usr/bin/env python
import os,socket,errno,types,tempfile
class NetworkError(IOError):
class FileError(IOError):
def updArgs(args,newarg=None):
& &if isinstance(args,IOError):
myargs = []
myargs.extend([arg for arg in args])
myargs = list(args)
& &if newarg:
myargs.append(newarg)
& &return tuple(myargs)
def fileArgs(file, mode, args):
& &if args[0] == errno.EACCES and 'access' in dir(os):
perms = ''
permd = {'r': os.R_OK, 'w': os.W_OK, 'x': os.X_OK}
pkeys = permd.keys()
pkeys.sort()
pkeys.reverse()
& & & &for eachPerm in 'rwx':
& &if os.access(file, permd[eachPerm]):
& & & &perms += eachPerm
& & & &perms += '-'
& & & &if isinstance(args,IOError):
& &myargs = []
& &myargs.extend([arg for arg in args])
& & & &else:
& &myargs = list(args)
& & & &myargs[1] = "'%s' %s (perms: '%s')" %(mode,myargs[1],perm)
& & & &myargs.append(args.filename)
myargs = args
& &return tuple(myargs)
def myconnect(sock,host,port):
sock.connect((host,port))
& &except socket.error, args:
myargs = updArgs(args)
& &if len(myargs) == 1:
myargs = (errno,ENXIO, myargs[0])
raise NetworkError, updArgs(myargs, host + ':' + str(port))
def myopen(file,mode='r'):
fo = open(file,mode)
& &except IOError,args:
raise FileError, fileArgs(file, mode, args)
& &return fo
def testfile():
& &file = &tempfile.mktemp()
& &f = open(file,'w')
& &f.close()
& &for eachTest in ((0, 'r'), (0100, 'r'),(0400,'w'),(0500, 'w')):
& &os.chmod(file, eachTest[0])
& &f = myopen(file, eachTest[1])
except FileError, args:
& &print "%s: %s" %(args.__class__.__name__, args)
& &print file, "opened ok... perm ignored"
& &f.close()
& &os.chmod(file,0777)
& &os.unlink(file)
def testnet():
& &s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
& &for eachHost in ('deli', 'www'):
& &myconnect(s, 'deli', 8080)
except NetworkError, args:
& &print "%s: %s" %(args.__class__.__name__, args)
if __name__ == '__main__':
& &testfile()
& &testnet()
--------------------------------------
10.10 为什么用异常(现在)?
10.11 到底为什么要异常?
10.12 异常和sys模块
... & & float('abc123')
... except:
... & & import sys
... & & exc_tuple = sys.exc_info()
&&& print exc_tuple
(&type 'exceptions.ValueError'&, ValueError('could not convert string to float: abc123',), &traceback object at 0x7f&)
&&& for eachItem in exc_tuple:
... & & print eachItem
&type 'exceptions.ValueError'&
could not convert string to float: abc123
&traceback object at 0x7f&
我们从sys.exc_info()得到的元祖中是:
exc_type: 异常类
exc_value: 异常类的实例
exc_traceback: 追踪对象
10.13 相关模块
exceptions内建异常(永远不用导入这个模块)
contectliba为使用with语句的上下文对象工具
sys包含各种异常相关的对象和函数
正文部分到此结束
08-27 (阅读 (7,047) )
04-24 (阅读 (1,401) )
网&&&名: 一路向北
英文名: Leon li
性&&&别: 男
职&&&业: DevOps
爱&&&好: 足球,健身,英语
简&&&介: 80后摩羯座攻城狮一枚,目前专注DevOps运维自动化, CI/CD集成, Docker分布式系统构建.
邮&&&箱: showerlee@
WP Cumulus Flash tag cloud by
9 or better.
最新文章热门文章手气不错
Powered by WordPress

我要回帖

更多关于 python基础语法 的文章

 

随机推荐