Python初级第4课——异常(只读课堂)

    科技2022-08-11  114

    欢迎来到“只读课堂”!

    这节课给大家介绍一下异常的内容,也就是我们平时接触最多的

    异常是什么

    当我们的程序发生一些解释器无法继续处理下去的事情,无法编译,就会抛出错误(异常);一般是一些

    逻辑错误,语法错误,无法生成结果

    等。

    In [1]:

    #但是有时我们可以不让异常发生的时候终止程序,而是让它去做一些别的事情。

    常见异常

    In [2]:

    mylist = [1,2,3,4,5]

    In [3]:

    del File "<ipython-input-3-44627d20a712>", line 1 del ^ SyntaxError: invalid syntax

    In [4]:

    mylist

    Out[4]:

    [1, 2, 3, 4, 5]

    In [5]:

    del mylist

    In [6]:

    mylist --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-6-787410b875dd> in <module>() ----> 1 mylist NameError: name 'mylist' is not defined

    In [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 zero

    In [10]:

    #这样也会报错

    In [11]:

    0/1

    Out[11]:

    0.0

    In [12]:

    #这样却不会,

    In [13]:

    #还有些常见的语法错误

    In [14]:

    if True File "<ipython-input-14-850f1eccbd09>", line 1 if True ^ SyntaxError: invalid syntax

    In [15]:

    if File "<ipython-input-15-9d526553a371>", line 1 if ^ SyntaxError: invalid syntax

    In [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: 2

    In [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 range

    In [24]:

    #还有就是访问对象的未知属性:

    In [25]:

    mylist

    Out[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 block

    In [31]:

    #在出现错误的时候,要善于总结,善于寻找。

    异常捕获

    In [32]:

    #首先来看一个语法:

    In [33]:

    #try: #except #finally:

    In [34]:

    #用这些就可以捕获异常代码。

    除数为0(ZeroDivisionError)

    In [35]:

    try: 1/0 except ZeroDivisionError: print("你的除数为0") 你的除数为0

    In [36]:

    #要把要捕获的错误写在except后面,而且会直接变成一个变量。

    In [37]:

    #这个错误一下子就不见了,会返回到“你的除数为0”。

    In [38]:

    #它就把默认的报错行为覆盖掉了,成了打印操作

    不存在的文件(FileNotFoundError)

    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]:

    #在我们捕获的语句没有发生错误的时候,就else

    In [46]:

    #不管你发生了错误还是没有,都会执行finally

    In [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]:

    #但是这样就失去了针对捕获的意义。

     

    Exception 包含了所有错误

     

    传递顺序颠倒

    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里面可以有两个except

    In [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教程就到这了,欢迎下一次的收看!

    Processed: 0.012, SQL: 8