欢迎来到“只读课堂”!
当我们的程序发生一些解释器无法继续处理下去的事情,无法编译,就会抛出错误(异常);一般是一些
等。
In [1]:
#但是有时我们可以不让异常发生的时候终止程序,而是让它去做一些别的事情。In [2]:
mylist = [1,2,3,4,5]In [3]:
del File "<ipython-input-3-44627d20a712>", line 1 del ^ SyntaxError: invalid syntaxIn [4]:
mylistOut[4]:
[1, 2, 3, 4, 5]In [5]:
del mylistIn [6]:
mylist --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-6-787410b875dd> in <module>() ----> 1 mylist NameError: name 'mylist' is not definedIn [7]:
#这样就是我们要找的,变量名不存在或变量写错了In [8]:
#它就会报错In [9]:
1/0 --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-9-9e1622b385b6> in <module>() ----> 1 1/0 ZeroDivisionError: division by zeroIn [10]:
#这样也会报错In [11]:
0/1Out[11]:
0.0In [12]:
#这样却不会,In [13]:
#还有些常见的语法错误In [14]:
if True File "<ipython-input-14-850f1eccbd09>", line 1 if True ^ SyntaxError: invalid syntaxIn [15]:
if File "<ipython-input-15-9d526553a371>", line 1 if ^ SyntaxError: invalid syntaxIn [16]:
#这些问题也是我们要找的两个错误。In [17]:
#先定个字典In [18]:
mydict = {1:'a'}In [19]:
mydict[2] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-19-da6e0285a451> in <module>() ----> 1 mydict[2] KeyError: 2In [20]:
#这里又会有错误In [21]:
#索引超出范围:In [22]:
mylist = [1,2,3,4]In [23]:
mylist[5] --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-23-30998d85754d> in <module>() ----> 1 mylist[5] IndexError: list index out of rangeIn [24]:
#还有就是访问对象的未知属性:In [25]:
mylistOut[25]:
[1, 2, 3, 4]In [26]:
mylist.open() --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-26-ec34de9e317b> in <module>() ----> 1 mylist.open() AttributeError: 'list' object has no attribute 'open'In [27]:
#同样的也是名字的问题In [28]:
#还有个缩进错误:In [30]:
if True: print('abc') File "<ipython-input-30-7327165db729>", line 2 print('abc') ^ IndentationError: expected an indented blockIn [31]:
#在出现错误的时候,要善于总结,善于寻找。In [32]:
#首先来看一个语法:In [33]:
#try: #except #finally:In [34]:
#用这些就可以捕获异常代码。In [35]:
try: 1/0 except ZeroDivisionError: print("你的除数为0") 你的除数为0In [36]:
#要把要捕获的错误写在except后面,而且会直接变成一个变量。In [37]:
#这个错误一下子就不见了,会返回到“你的除数为0”。In [38]:
#它就把默认的报错行为覆盖掉了,成了打印操作In [39]:
try: myfile = open('1.txt','r') except FileNotFoundError: print("你的文件不存在") finally: print('打开文件结束了') 你的文件不存在 打开文件结束了In [40]:
#finally就是把它关闭。In [41]:
#打开一个不存在的文件In [42]:
try: myfile = open('1.txt','w') except FileNotFoundError: print("你的文件不存在") else: print('aaaaa') finally: print('打开文件结束了') aaaaa 打开文件结束了In [43]:
#它还有个配套代码:else。In [44]:
#但是如果用写权限打开一个不存在的文件,它会自动帮你创建一个文件,不会报错。In [45]:
#在我们捕获的语句没有发生错误的时候,就elseIn [46]:
#不管你发生了错误还是没有,都会执行finallyIn [47]:
try: myfile = open('1.txt','r') except FileNotFoundError: print("你的文件不存在") else: print('文件关闭') myfile.close() finally: print('打开文件结束了') 文件关闭 打开文件结束了In [48]:
#如果你不想记那些错误,可以加入:In [49]:
# except Exception:In [50]:
#这样它就能捕获所有错误,只要是错误,就能包括In [51]:
#但是这样就失去了针对捕获的意义。In [56]:
def func(var,index): return var[index] mylist = input('请输入你要访问的列表:') index = input("请输入你要访问的位置:") try: num = func(mylist,index) except TypeError: print("你的传递顺序颠倒了") except IndexError: print("你的索引大于了列表上限") else: print(num) finally: print('使用完毕') 请输入你要访问的列表:[1,2,3,4] 请输入你要访问的位置:5 你的传递顺序颠倒了 使用完毕In [57]:
#一个try里面可以有两个exceptIn [58]:
#最好把错误写出来,这样更有针对性。In [61]:
def func(var,index): return var[index] mylist = input('请输入你要访问的列表:') index = input("请输入你要访问的位置:") mylist = list(mylist) index = int(index) try: num = func(mylist,index) except TypeError: print("你的传递顺序颠倒了") except IndexError: print("你的索引大于了列表上限") else: print(num) finally: print('使用完毕') 请输入你要访问的列表:list('[1,2,3,4]') 请输入你要访问的位置:5 ' 使用完毕In [62]:
#这样是不行的,In [63]:
#我们要用到 字符串->列表。In [64]:
eval('[1,2,3,4]')Out[64]:
[1, 2, 3, 4]In [65]:
#如果是个列表,它就会变成列表In [67]:
def func(var,index): return var[index] mylist = input('请输入你要访问的列表:') index = input("请输入你要访问的位置:") mylist = eval(mylist) index = int(index) try: num = func(mylist,index) except TypeError: print("你的传递顺序颠倒了") except IndexError: print("你的索引大于了列表上限") else: print(num) finally: print('使用完毕') 请输入你要访问的列表:[1,22,3,4] 请输入你要访问的位置:5 你的索引大于了列表上限 使用完毕In [68]:
#如果说再调用一下In [69]:
def func(var,index): return var[index] mylist = input('请输入你要访问的列表:') index = input("请输入你要访问的位置:") mylist = eval(mylist) index = int(index) try: num = func(mylist,index) except TypeError: print("你的传递顺序颠倒了") except IndexError: print("你的索引大于了列表上限") else: print(num) finally: print('使用完毕') 请输入你要访问的列表:5 请输入你要访问的位置:[1,2,3,4,5] --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-69-5db2b2c2a8b8> in <module>() 6 7 mylist = eval(mylist) ----> 8 index = int(index) 9 try: 10 num = func(mylist,index) ValueError: invalid literal for int() with base 10: '[1,2,3,4,5]'In [70]:
#这样它就会报错In [72]:
#应该放在try之中:In [ ]:
def func(var,index): return var[index] mylist = input('请输入你要访问的列表:') index = input("请输入你要访问的位置:") try: mylist = eval(mylist) index = int(index) num = func(mylist,index) except TypeError: print("你的传递顺序颠倒了") except IndexError: print("你的索引大于了列表上限") except ValueError: print("你的传递顺序颠倒了") else: print(num) finally: print('使用完毕')本次只读课堂的python教程就到这了,欢迎下一次的收看!