14.异常处理
只要是人编写的代码,或多或少都会存在一些Bug,当这些Bug被程序捕捉之后,需要怎么处理,就需要我们告诉代码应该处理,通常称之为异常处理。
14.1 什么是异常
Python使用异常对象来表示异常状态,并在遇到错误进引发异常,异常对象被捕捉到未处理,程序则会终止并显示相应的错误信息,经典的异常信息如下所示:
>>> 1/0
Traceback (most recent call last):
File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
以上的信息明确告诉我们,除数为0导致产生异常,但如果只是显示错误信息,没有太大意义。针对这种需要在代码中进行捕捉并提供处理方案。
14.2 自定义异常
可能在代码中,某些代码并不会触发异常,但却不符合业务逻辑,需要人为的抛出异常,这时就需要自定义异常了。
14.2.1 raise语句
使用raise可以引发异常,并将一个类(必须是Exception的子类)或实例做为参数。如果将类做作为参数,将自动创建实例。如下所示:
>>> raise Exception
Traceback (most recent call last):
File "<input>", line 1, in <module>
Exception
>>> raise Exception("i am Exception")
Traceback (most recent call last):
File "<input>", line 1, in <module>
Exception: i am Exception
示例一为通用异常,无法得知具体的异常信息,示例二,自定义了异常的详细信息,这种方便用户定位问题。常见的内置异常类如下所示:
14.2.2 自定义异常类
虽然内置的异常非常多,能满足大多数的需求,但也有不能满足的情况下,这时就可以自定义异常类,并添加种类异常类中的方法。通过语法格式如下所示:
class MyException(Exception):
pass
14.3 捕捉异常
将代码中可能存在异常的错误给抓取到并显示出来称为捕捉异常。针对这种情况,Python提供了try...except...else语句。其基本语法格式如下所示:
try:
pass
except ErrorType:
pass
else:
pass
finally:
pass
以上的为最全的一种格式,日常应用else和finally可省略。
14.3.1 try...except:
这种形式是日常形式使用最多的一种情况,示例代码如下所示:
def div(x,y):
try:
return x/y
except ZeroDivisionError:
raise Exception("除数为0")
14.3.2 多个except语句
当某一段代码可能存在多种异常时,可以使用多个except语句,示例代码如下所示:
def div(x,y):
try:
x=int(x)
y=int(y)
return x/y
except ZeroDivisionError:
print("除数为0")
except TypeError:
print("传入的参数不是数字")
如果代码有很多异常需要处理,需要写很多个except语句,Python也支持一个except语句捕捉多种异常,可放在元组中实现,如下所示:
def div(x,y):
try:
x=int(x)
y=int(y)
return x/y
except (ZeroDivisionError,TypeError,OSError):
print("程序开小差啦。。。。")
14.3.3 捕捉对象
要在except子句中访问异常对象本身,虽然可以使用元组传递参数,但参数也只有一个。而如果需要将其对应的详细错误信息打印出来可以使用以下这种形式:
def div(x,y):
try:
x=int(x)
y=int(y)
return x/y
except (ZeroDivisionError,TypeError,OSError) as ex:
print(f"程序开小差啦。。。。\\n{ex}")
上述代码中,except可以捕捉3种异常,但因同时显式捕捉了对象本身,因此可以将其详细错误打印出来,方便代码调试和维护。
14.4.4 try...except...else
在某些情况下,在没出现异常时,希望继续下一个代码块。则可以像for...else一样,使用try...except...else。示例代码如下所示:
def sub(x,y):
try:
x=int(x)
y=int(y)
except Exception as ex:
print(f"捕捉到异常\\n{ex}")
else:
return x-y
以上代码,当x,y被转换为整型数据没有出现异常时,则运行else中的代码块。
14.4.5 try...finally
无语是否发生异常,在程序结束前,均执行finally中的语句。示例代码如下所示:
def sub(x,y):
try:
x=int(x)
y=int(y)
except Exception as ex:
print(f"捕捉到异常\\n{ex}")
else:
print(f"程序运行结果为:{x-y}")
finally:
print("无论程序是否有异常,都需要运行我")
Python中的异常处理并不太很难,在平时的实践过程,应该在可能出现异常的代码添加异常处理,方便调试、排错和代码定位。
本文地址:https://www.cnblogs.com/surpassme/p/13020566.html
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注: