看了一下官方教程的第二部分,发现用了异常处理机制.因为我的学习计划是围绕着项目进行了,技能点不够用了就去打打怪提升下等级.
0.编程时会出现的错误和异常
a.代码本身的错误,也就是bug.比如 字符串少打了一个引号,引起的语法错误.
b.代码使用者错误的使用代码而产生的问题. 比如需要带入整数的却带入字符串
c.使用代码是因为运行环境的差异而导致的问题. 比如向硬盘里写入数据时硬盘满了或者坏了.
1.try...except...finally
a.基本的使用方法
try...except...finaly 和if,else一样是控制流语句. 先会运行try中的代码,如果某一行代码出现了异常那么就会转跳到except的代码块中,不管程序是否报错都会执行finally中的代码.
# coding:gbk try: # 错误的路径 f = open(r'C:\Fallout4.txt') print('1') print('2') print('3') print(f.read()) except: print('哦偶,哪里弄错了.') finally: print('退出程序')
返回的结果:
哦偶,哪里弄错了. 退出程序
# coding:gbk try: # 正确的路径 f = open(r'C:\test\Fallout4.txt') print('1') print('2') print('3') print(f.read()) except: print('哦偶,哪里弄错了.') finally: print('退出程序')
返回的结果<span style="font-size:18px;"><span style="font-size:18px;">1 2 3 shut up and take my money. 退出程序</span></span>
except还可以加两个参数,需要捕获的错误,和一个错误的原因. 如果有两个except语句,try中的语句快同时又这两个错误,Python只会捕获第一个产生异常(因为直接转跳了).
# coding:gbk try: # 错误的路径 a f = open(r'C:\Fallout4.txt') print('1') print('2') print('3') print(f.read()) except NameError, e: print('哦偶{0}'.format(e)) except IOError, e: print('哦偶{0}'.format(e)) finally: print('退出程序'
2.raise
Python认为一切正常,你却需要程序报错要什么办呢? 用raise自己引发一个异常.
# coding:gbk class FooError(StandardError): pass def foo(s): n = int(s) if n == 1: raise FooError('invaild value:{0}'.format(s)) return 10/n foo(1)
结果
Traceback (most recent call last): File "C:/Users/bin/PycharmProjects/untitled1/test_raise.py", line 12, in <module> foo(1) File "C:/Users/bin/PycharmProjects/untitled1/test_raise.py", line 9, in foo raise FooError('invaild value:{0}'.format(s)) __main__.FooError: invaild value:1
3.with...as
with...as 语句是try...except...finally的简化版, with之后跟着特殊的对象 as 一个变量赋值给了那个特殊的变量.
with open(r'c:\test\Fallout4.txt') as anything : print (anything.read())
具体可以看下面两个链接:
详细的说明