python-异常处理
一、什么是错误和异常
1、错误
语法错误:python 的语法错误或者称之为解析错
逻辑错误:Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常
2、异常
程序运行时发生错误时的信号,它会终止程序运行
异常有三部分:
异常追踪信息
异常类
异常值

3、异常类型
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
二、异常处理
1、什么是异常处理
程序运行发生异常(也可以是自己触发),捕捉到这个异常
捕捉成功就进入另一个处理分支,执行针对异常处理的逻辑,是程序不终止。
2、为什么要异常处理
程序遇到错误时,发生异常,程序就会终止运行,后面就代码就不会执行了。
异常处理就是让程序在发生错误时能继续运行,增加健壮性和容错性
3、如何异常处理
3.1、使用if判断式处理
注意:不是只有使用try/except才是异常处理,只要是针对可能出现的错误情况进行处理都是异常处理。使用if判断也是
缺点: 1、if判断只针对某一段代码,需要重复用if处理
2、大量与主逻辑无关的代码,可读性差
3.2、使用try……except……
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它
3.2.1、基本语法
try: # 运行主逻辑代码 num1 = input("==>") int(num1) num2 = input("==>") int(num2) except ValueError as e: # 捕捉 到这个类型的错误 print(e) # 捕捉到异常后处理逻辑 print("try之外")
运行结果
==>fdf invalid literal for int() with base 10: 'fdf' try之外
3.2.2、多分支异常
try后可以有多个except,捕捉多个异常类型
num1 = 12313 lis = [1, 2, 3] try: # 运行主逻辑代码 int(num1) l = lis[1000] # 发生IndexError被except捕捉到 except ValueError as e: print("ValueError异常", e) except IndexError as e: print("IndexError异常", e) print("try之外")
运行结果
IndexError异常 list index out of range
try之外
如果不同的异常类型,但处理逻辑都一样。那么可以将多个异常类型放到一个元组中,一个except语句来处理多个异常信息
num1 = 12313 lis = [1, 2, 3] try: # 运行主逻辑代码 int(num1) l = lis[1000] # 发生IndexError被except捕捉到 except(ValueError,IndexError)as e: print("发生异常了", e) print("try之外")
运行结果
发生异常了 list index out of range
try之外
3.2.3、万能异常
Exception可以捕捉所有异常类型
# 万能异常 num1 = "fdfd" lis = [1, 2, 3] try: # 运行主逻辑代码 int(num1) l = lis[1000] except Exception as e: #Exception可以捕捉所有异常类型 print("发生异常了", e) print("try之外")
运行结果
发生异常了 invalid literal for int() with base 10: 'fdfd' try之外
3.3 try/except/else异常的else分支
没有异常时,则执行else分支结构下的代码
num1 = 5656 lis = [1, 2, 3] try: # 运行主逻辑代码 int(num1) l = lis[1] except ValueError as e: print("ValueError异常", e) except IndexError as e: print("IndexError异常", e) except Exception as e: print("可以捕捉所有异常") else: print("try里没有异常,就执行这里") print("在try之外")
运行结果
try里没有异常,就执行这里
在try之外
3.4、try/except/else/finally
不管是否异常,都会执行finally结构分支下的代码
一般用于清理工作、关闭连接
num1 = 5656 lis = [1, 2, 3] try: # 运行主逻辑代码 int(num1) l = lis[1000] except ValueError as e: print("ValueError异常", e) except IndexError as e: print("IndexError异常", e) except Exception as e: print("可以捕捉所有异常") else: print("try里没有异常,就执行这里") finally: print("不管有没有异常,都执行这里") print("在try之外")
运行结果
IndexError异常 list index out of range
不管有没有异常,都执行这里
在try之外
三、主动触发异常
使用 raise 语句抛出一个指定的异常
num1 = 5656 try: # 运行主逻辑代码 num1 = int(num1) if num1 > 10: raise Exception("num1大于10了,主动触发异常") except ValueError as e: print("ValueError异常", e) except Exception as e: print(e) else: print("try里没有异常,就执行这里") print("在try之外")
运行结果
num1大于10了,主动触发异常
在try之外
四、自定义异常类
通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承
# 定义一个异常类,该类要继承Exception class MyError(Exception): def __init__(self,msg): self.msg = msg num1 = 20 try: if num1 >10: raise MyError("超10了") except MyError as e: print(e)
运行结果
超10了
五、断言
断言:判断某表达式,表达式是False时,抛出异常,终止运行;True时,程序继续运行
assert 1 == 2 print("#"*40)
# 等价于
# if not 1 == 2:
# raise AssertionError
运行结果
assert 1 == 2 print("#"*40)
六、总结
1、

2、慎用异常处理,一般只有对不可以预知的异常情况异常处理
浙公网安备 33010602011771号