异常是什么
python使用异常对象来表示异常对象,并且再遇到错误时引发异常,当异常对象没有被处理的时候,程序会直接报出一个错误,需要注意的是:每一个异常实际上都是一个类的实例,本次博客的目的是用各种方法来捕获这些实例,并且采取某些措施,以免使程序运行报错
raise语句
raise一般是在想调出相应的错误时才会执行,例如想直接报出Exception的错误,直接在代码中执行raise Exception即可,具体的异常类较多,这里不一一列举
异常捕获
一般的异常捕获
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
print(x/y)
except ZeroDivisionError:
print("the second number can not be zero ! ")
上面可以看出,在第二个值即y的值为0的时候,按照道理,是应该直接报错的,所以这里直接采用了一个try和except语句来捕获这样的错误,虽然上面的语句是可以采用一个if语句来实现嵌套,但是这里需要考虑到的是,如果这里需要输入的值比较多或者代码比较复杂的时候,if语句的嵌套将会变的非常的复杂,所有采用try语句来实现相应的代码捕获其实是一个很好的处理方式
可选择性的用异常处理
class MuffledCalculator:
muffled=False
def cal(self,expression):
try:
return eval(expression)
except ZeroDivisionError:
if self.muffled:
print("Division by zero is illagel")
else:
raise
cal=MuffledCalculator()
print(cal.cal("10/2"))
cal3=MuffledCalculator()
print(cal2.cal("10/0"))
cal2=MuffledCalculator()
cal2.muffled=True
print(cal2.cal("10/0"))
以上的操作中可以看到,这里直接定义了一个MuffledCalculator类,同时在这个类里面直接定义了一个muffled的属性,在需要进行异常捕获的时候直接将其设置为true即可,在不需要捕获异常处理时,将buffled的值设置为false即可,当然这里默认将其设置为false
多个except
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
print(x/y)
except ZeroDivisionError:
print("the second number can not be zero ! ")
except ValueError:
print("you shoule input int ! ")
这里为了捕获多个异常的情况,直接设置多个except即可,这里便可以对特定的多个except语句进行处理,实际上还可以对以上的语句代码进行简化得到下面的代码语句
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
print(x/y)
except (ZeroDivisionError,ValueError):
print("please input right number ")
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
print(x/y)
except (ZeroDivisionError,ValueError) as e:
print(e)
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
print(x/y)
except :
print("there is something wrong !")
以上的代码都可以实现相应的功能(实现对多个异常的捕获),需要注意的时在需要特定输入的情况下,用户没有输入而直接回车,或者用户直接ctrl+c语句来推出代码的执行时,这就需要以第三种方式来对异常进行处理,但是这里比较麻烦的是没有一个特定的处理错误的方法,需要编译特定的语句(实际上sys.exit也可以停止代码的执行)
异常处理操作
while True:
try:
x=int(input("please input x : "))
y=int(input("please input y : "))
value=x/y
print("the value of x/y is : ",value)
except:
print("invalid input ! ")
else:
break
finally语句
x=None
try:
x=1/0
finally:
print("cleaning up")
del x
这里的finally表示的是,不管以上代码中园内有异常的出现,都会直接的执行finally语句,需要注意的是为什么在try之前要定义x为none呢,理由是如果之前没有定义x为none的话,在执行语句的时候,报错的zerodivisionerror会直接在在语句之前就会报错,而不会直接进入循环体里面,因此需要在语句之前定义好x为none
异常和函数
需要注意的是异常和函数天然的就在一起考虑,一般情况下如果不处理函数中的异常,异常将会一直向上传递到调用函数的地方,如果该处仍然没有被处理,则异常会一直向上传递,直到到达主程序(全局作用域)如果主程序也没有处理异常,则例程序将会停止并且显示栈跟踪的消息