分享

Python 异常处理

 星光闪亮图书馆 2019-09-05

一般情况下,在Python无法正常处理程序时就会发生一个异常,弹出一大串英文提示。对于一般用户来说会无所适从,影响用户体验,严重的会导致程序崩溃。我们需要对异常捕获进行处理。

一、异常处理的语法:

try:<语句> #要执行的代码except <名字1>:#捕获异常名<语句> #对捕获的异常进行处理except <名字2>:#如果对多个异常一并处理,用逗号分隔异常名<语句> else:<语句> #如果没有异常发生

例如:

try: print('-'*20)	#把符号打印20遍,python特有的语法功能,方便易用吧 n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except ZeroDivisionError: print('除数不能为0!')except ValueError: print('只能输入数字!')

运行结果:

--------------------input first num:7input second num:0除数不能为0!>>> --------------------input first num:ainput second num:5只能输入数字!

二、捕获异常的描述信息

把描述信息用as 保存到变量中,这样就看到系统提示的英文异常了。如下例:

try: print('-'*20) n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except (ZeroDivisionError, ValueError) as desc: print('捕捉到异常:%s' %desc)

结果:

--------------------input first num:5input second num:0捕捉到异常:division by zero

三、捕获所有的异常

异常会有很多,常常防不胜防。这时,我们可以不指明异常类型,让它可以处理任何异常。

except : print('出错了')也可以把具体的异常信息打印出来。except Exception as desc: print('捕捉到异常:%s' %desc)

四、异常后处理

发生异常后,有些事情必须要进行处理,比如变量释放,锁释放,文件关闭等等,否则系统会崩溃。这些要处理的代码要放在try....except...finally语句的finally区。如下例:

finally: f.close() print('释放资源')

注意:

try....except...else...finally,顺序不能反,else和finally可选,else语句的存在以except存在为前提。

五、主动抛出异常

raise显式地触发异常,如下例:

try: raise IndexErrorexcept IndexError: print('索引越界')except: print('出错了')

结果:

索引越界

附:常见异常

1. NameError

访问一个未申明的变量,会引发NameError异常。

2. ZeroDivisionError

被0除,会引发ZeroDivisionError异常。

3. SystaxError

语法错误,会引发SystaxError异常。

4. IndexError

访问序列中不存在的索引时,会引发IndexError异常。

5. KeyError

访问dictionary中不存在的键时,会引发KeyError异常。

6. FileNotFoundError

访问不存在的文件,会引发FileNotFoundError异常。

7. AttributeError

访问不存在的对象属性时,会引发AttributeError异常。

六、assert断言

断言指期望用户满足指定的条件,当不满足用户定义的约束条件时,它会触发AssertionError异常。可以看作是条件式的raise语句。格式如下:

Assert 逻辑表达式,data		#data是可选的

等同于:

If not 逻辑表达式: raise AssertionError(data)

如下例:

a=0assert a != 0,'a值不能为0!'

结果:

Traceback (most recent call last): File 'D:/pyTest/test.py', line 2, in <module> assert a != 0,'a值不能为0!'AssertionError: a值不能为0!

七、自定义异常

先定义一个继承Exception类的子类,再用raise调用这个异常类。如下例:

class ShortInputException(Exception):	#定义一个异常类 def __init__(self, pw): self.pw = pwtry: text=input('请输入密码:') if len(text) < 6: raise ShortInputException(text)except ShortInputException: print('密码长度不能小于6位!')except Exception as desc: print('出错了:%s' %desc)

运行结果:

请输入密码:1234密码长度不能小于6位!

八、预定义清理

Finally可以关闭文件,清理资源。除了finally手动释放资源外,还可以用with语句预定义清理操作,即无论资源在使用过程中是否发生异常,都会执行清理的操作,比如文件使用后自动关闭。

With 上下文表达式 [as 资源对象]:	对象的操作

上下文表达式:返回一个上下文管理器对象。若指定了as子句,该对象并不赋值给资源对象,而是将上下文管理器的__enter__()方法的返回值赋值给资源对象。

资源对象:可以是单个变量,也可以是元组。

对象的操作:with语句包裹的代码块。在执行该代码块之前,会调用上下文管理器的__enter__()方法;在执行该代码块之后,会执行__exit__()方法。

如下例:

with open(“/tmp/abc.txt”) as file: data=file.read()

使用with语句打开文件,如果能打开则将文件对象赋值给file,然后执行with语句的代码块,读文件。代码块执行完毕后,with语句会关闭文件。即使代码块运行过程中产生了异常,with语句也会关闭文件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多