异常处理
1.什么是异常
异常发生之后,异常之后的代码就不执行了
2.什么是异常处理
python解释器检测到错误,除法异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
3.为什么要进行异常处理
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行.所以必须提供一种异常处理机制来增强程序的健壮性和容错性
4.如何进行异常处理
1 while True: 2 try: 3 x = int(input("输入一个数字:")) 4 break 5 except ValueError: 6 print("1")
以上例子中,让用户输入一个合法的整数,但是允许用户中断这个程序,用户中断的信息会引发一个KeyboardInterrupt异常.
try语句按照如下方式工作:
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except语句,try子句执行后结束
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略.如果异常的类型和except之后的名称相符,那么对应的except子句将被执行.最后执行try语句之后的代码
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
一个try语句可能包含多个except子句,分别来处理不同的特定的异常.最多只有一个分支会被执行
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的try的处理程序中的异常
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里称为一个元组,例如:
1 except(RuntimeError,TypeError,NameError): 2 pass
try except语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后.这个子句将在try子句没有发生任何异常的时候执行,例如:
1 for arg in sys.argv[1:]: 2 try: 3 f = open(arg,"r") 4 except IOError: 5 print("can not open",arg) 6 else: 7 print(arg,"has",len(f.readlines()),"lines") 8 f.close() 9
使用else子句比把所有的语句都放在try子句里面要好,这样可以避免一些意想不到的,而except又没有捕获的异常.
异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至简介调用的函数)里抛出的异常.例如:
1 def this_fails(): 2 x = 1/0 3 try: 4 this_fails() 5 except ZeroDivisionError as err: 6 print("有运行错误",error) 7 8 有运行错误:int division or modulo by zero
万能异常:在python的异常中,有一个万能异常:Exception,它可以捕获任意异常,即:
1 s = "hello" 2 try: 3 int(s) 4 except Exception as e: 5 print(e)
如果想对于不同的异常定制不同的处理逻辑,就需要用到多分支
1 s1 = "hello" 2 try: 3 int(s) 4 except IndexError as e: 5 print(e) 6 except KeyError as e: 7 print(e) 8 except ValueError as e: 9 print(e)
5.主动抛出异常
使用raie语句抛出一个指定的异常,例如:
1 try: 2 raise TypeError("类型错误") 3 except Exception as e: 4 print(e) 5 6 TypeError:类型错误
raise唯一的一个参数制定了要被抛出的异常,它必须是一个异常的实例或者是异常的类,(也就是Exception的子类)
6.断言(assert)
assert 断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假
可以理解assert断言语句为raise-if-not,用来测试表达式,其返回值为假,就会触发异常.