异常概述


程序出现逻辑错误或者用户输入不合法都会引发异常,可以利用异常处理机制捕获异常并从内部解决,避免程序的崩溃。


异常举例

>>>file_name = input('输入文件名:')

f = open(file_name,'r')

for each_line in f:

print(each_line)




若用户输入不存在的文件名,则会出现FileNotFoundError异常


异常类型


1)AssertionError:断言语句失败


当assert关键字后的条件为假时,程序将停止并抛出AssertionError异常。assert语句在测试程序时用于在代码置入检查点。


>>>assert 1>2  #AssertionError



2)AttributeError:尝试访问未知的对象属性


当尝试访问未知的对象属性不存在时抛出


>>>my_list = []

>>>my_list.fishc



3)IndexError:索引超出序列的范围


>>>my_list = [1,2]

>>>my_list[3]



4)KeyError:字典中查找不存在的键


>>>my_dict = {"1":2,"2",3}

>>>my_dict["1"]

2

>>>my_dict["3"]  #KeyError


5)NameError:尝试访问不存在的变量


>>>fish   #NameError



6)OSError:操作系统产生的异常


OSError有许多子类,如FileNotFoundError,已举例


7)SyntaxError:语法错误


>>>print"go"  #SyntaxError



8)TypeError:不同类型间的无效操作


>>>1 + '1'



9)ZeroDivisionError:除数为0


>>>5/0



异常捕获与处理


异常捕获使用try语句实现,任何在try语句范围内的异常都会被及时捕获。


try语句


try语句的两种形式:try-except和try-finally,try语句一旦出现异常,剩余语句将不再执行


try-except语句


 try:

     检测范围

 except Exception[as reason]:

     出现异常后的处理代码


示例


try:

    f = open('win.txt')

    print(f.read())

    f.close()

except OSError as reason:             #使用as将具体错误信息打印出来

    print('OSerror occurs\n错误原因是:' + str(reason))




若文本文件不存在


>>>

OSerror occurs

错误原因是FileNotFoundError

>>>




针对不同异常设置多个except



try:

    sum = 1 + '1'

    f = open('win.txt')

    print(f.read())

    f.close()

except OSError as reason:             #使用as将具体错误信息打印出来

    print('OSError occurs\n错误原因是:' + str(reason))

except TypeError as reason:             #使用as将具体错误信息打印出来

    print('TypeError occurs\n错误原因是:' + str(reason))



对多个异常统一处理



try:

    sum = 1 + '1'

    f = open('win.txt')

    print(f.read())

    f.close()

except (OSError,TypeError):

    print('OSError occurs\n错误原因是:' + str(reason))



捕获所有异常


...

except:

      print('error')



try-finally语句


finall语句为必须执行的部分


try:

    f = open('win.txt')

print(f.read())

    sum = 1 + '1'

except:

    print('error')

finally:

    f.close()




若文本文件存在,则异常发生在sum = 1 + '1'语句上,程序执行except语句,为了关闭文件这样的必需操作,添加finally语句,不管程序是否异常都会执行这一部分。

raise语句

自己抛出异常,可带参数,表示异常的解释


>>>raise ZeroDivisionError("除数不为0")

ZeroDivisionError("除数不为0")



else语句


1.if-else搭配




不累述


2.与for或while语句搭配使用


else语句内容在循环完成后执行,即若中途使用break语句跳出,else内容就不会执行


while 条件:

   循环内容

else:

   执行完循环执行内容


def MaxFactor(num):

   count = num // 2   #floor

   while count > 1:

        if num % count == 0:

             print(' %d 最大的约数是 %d ' % (num,count))

             break

        count -= 1

   else:

       print('%d是素数!' % num)


num = int(input('please input a number:'))

MaxFactor(num)



该程序用于求用户输入数的最大约数,注意除法方式为地板除法,使用暴力方式,若得到最大的约数,则break,不执行else语句,若找不到最大约数,则执行else语句


3.与try-except语句搭配使用


只要try语句不出现任何异常,则执行else语句内容


try:

    int('ab')

except ValueError as reason:

    print('error:' + str(reason))

else:

   print('all is well')



简洁的while语句


Python提供with语句,利用此语句抽象出文件操作中频繁使用的try\except\finally语句。对文件操作用with语句好处在于不用担心忘记关闭文件(with会自动帮你关闭)


原代码


try:

   f = open('data.txt','w')

   for each_line in f:

      print(each_line)

except OSError as reason

   print('error:' + str(reason))

finally

   f.close()



现代码



try:

   with open('data.txt','w') as f:

     for each_line in f:

         print(each_line)

except OSError as reason

   print('error:' + str(reason))