在程序运行的过程中,有可能出现各种错误,我们就需要对这种错误做处理,比如我们写一个除法运算的函数, 当用户给的除数为 0 的时候,我们就要做这种错误处理。
对程序进行错误处理的一种方式是我们可以事先约定返回一个错误代码,这样,就可以知道是否有错, 以及出错的原因,比如当用户给的除数为 0 的时候,我们给用户返回一个值告诉用户除数不能为 0, 但是应该返回什么值比较好呢,假如我们返回 -1 来告诉用户除数不能为 0,但是对正常的运算也有可能出现 -1 的情况,比如 5 / -5。当然我们可以返回一个正常运算无法得到的值,比如返回一个字符串 "error"。
我们也可以采用一种比较简单,粗暴,直接的方式来处理除数为 0 的情况,当用户给的除数为 0 的时候,我们直接给用户抛出一个异常, 让程序停止运行。
本节课我们就重点学习如何抛出异常,以及对异常进行处理。
在 Python 内置的众多函数中,对错误处理的方式,有的是是采用返回值的方式,有的是采用抛出异常的方式。 我们先来看两个常用的函数,比如字符串内置的 find 函数,当给出的子串不存时,错误处理是返回 -1;Python 内置的 divmod 函数,当给出的除数为 0 的时候,错误处理是抛出异常。
mystr = "hello" index = mystr.find("nihao") # 返回 -1 data = divmod(250, 0) # 抛出异常
当然我们自己写函数,也可以采用通过返回值的方式,做错误处理。
def division(ldata, rdata): if rdata == 0: return "error" else: return ldata / rdata data = division(250, 0)
我们也可以通过抛出异常的方式,做错误处理。
def division(ldata, rdata): if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata data = division(250, 0)
对于返回值处理错误的方式我们可以根据返回值做业务逻辑处理,本节课我们不在赘述, 本节课我们重点学习当抛出异常后,我们怎么继续处理这些异常,首先我们来学习 try...except 语句。
def division(ldata, rdata): if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata try: data = division(250, 0) # division 函数抛出异常 except: print("除数不能为0") # 我们继续写代码处理掉异常
当然有时候,我们的语句发生的错误有好几种原因,当然 except 可以根据错误原因进行针对性捕获。
def division(ldata, rdata): if not isinstance(ldata, (int, float)) or not isinstance(rdata, (int, float)): raise TypeError("类型错误") if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata try: data = division("hello", 4) # 大家可以尝试给被除数和除数输入非数字类型或者除数为 0 做测试。 except ValueError: print("除数不能为 0") except TypeError: print("请输入数字类型数据")
当然对于针对性的捕获异常,如果异常没有捕获到,异常则会传递。
def division(ldata, rdata): if not isinstance(ldata, (int, float)) or not isinstance(rdata, (int, float)): raise TypeError("类型错误") if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata try: data = division("hello", 4) # 抛出的是 TypeError except ValueError: # 捕获的是 ValueError print("除数不能为 0")
有很多函数引发的异常行为很多,但是我们只想处理我们想处理的异常行为,对于不想处理的异常,我们可以放在 except 里面统一处理。
def division(ldata, rdata): if not isinstance(ldata, (int, float)) or not isinstance(rdata, (int, float)): raise TypeError("类型错误") if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata try: data = division("hello", 4) # 抛出的是 TypeError except ValueError: # 捕获的是 ValueError print("除数不能为 0") except: # 捕获除 ValueError 之外的所有异常 print("其它异常")
try...except 语句还支持 finally,finally 的意思是无论有没有异常,最终都要进入该语句块执行代码, 注意 finally 不做异常处理,且只能放在 except 语句后面。
def division(ldata, rdata): if not isinstance(ldata, (int, float)) or not isinstance(rdata, (int, float)): raise TypeError("类型错误") if rdata == 0: raise ValueError("除数不能为 0") else: return ldata / rdata try: data = division("hello", 4) except TypeError: print("请输入数字类型数据") finally: # 没有异常或已经处理掉异常也会进入该语句 print("over") try: data = division("hello", 4) except ValueError: print("请输入数字类型数据") finally: # finally 不做异常处理,会继续抛出异常 print("over")
会自己处理程序错误,返回错误码或者抛出异常方式。
熟练使用 try...except...finally 语句。
写一个除法运算函数,对于除法运算符抛出的异常做用户提醒处理,一直到用户输入正确为止,返回除法运算值。
感谢