一些常用的内置异常类
使用raise可以抛出异常类:raise Exception("xxxxxx") 。
1、自定义异常类
和java类似,自定义异常类时需要直接或间接继承Exception类。
# 测试异常
# 自定义异常类
class MyException(Exception):
pass
2、捕获异常
# 在调用其他人的方法时,可以使用try except进行异常的捕获
# 如果不捕获异常将会向上传播
try:
x = int(input("please input the first number:"))
y = int(input("please input the second number:"))
print("x / y = ", x / y)
except Exception:
print("has exception")
结果
please input the first number:12
please input the second number:0
has exception
3、捕获异常与抛出异常
# 在处理异常的语句中可以选择继续抛出该异常或者抛出其他异常
class ExceptionTest:
flag = False
def setFlag(self, flag):
ExceptionTest.flag = flag
def method(self):
try:
x = int(input("please input the first number:"))
y = int(input("please input the second number:"))
print("x / y = ", x / y)
except ZeroDivisionError:
if ExceptionTest.flag:
print("can't div by zero")
else:
raise ValueError
exceptionTest = ExceptionTest()
# 设置为False,异常将会被抛出
exceptionTest.setFlag(True)
exceptionTest.method()
结果
please input the first number:12
please input the second number:0
can't div by zero
4、捕获多个异常
try块中可能不止除0异常,输入的可能不是数字导致转换成数字时发生错误。所以可使用多个except对异常进行捕获。
# 捕获多个异常
class ExceptionTest:
flag = False
def setFlag(self, flag):
ExceptionTest.flag = flag
def method(self):
try:
x = int(input("please input the first number:"))
y = int(input("please input the second number:"))
print("x / y = ", x / y)
except ZeroDivisionError:
if ExceptionTest.flag:
print("can't div by zero")
else:
raise ValueError
except ValueError:
if ExceptionTest.flag:
print("the number must be numerical")
else:
raise ValueError
exceptionTest = ExceptionTest()
exceptionTest.setFlag(True)
exceptionTest.method()
结果
please input the first number:12
please input the second number:s
the number must be numerical
捕获多个异常时还可以为如下方式,将多个异常写在括号中,同时将异常赋值给一个对象
# 捕获多个异常的修改版
class ExceptionTest:
flag = False
def setFlag(self, flag):
ExceptionTest.flag = flag
def method(self):
try:
x = int(input("please input the first number:"))
y = int(input("please input the second number:"))
print("x / y = ", x / y)
# 通常可以使用except Exception as e对异常进行捕获。
# 因为Exception的基类为BaseException,所以对于继承BaseException的子类可能不能被捕获到
# 还可以使用 except: 来捕获异常但是这样比较危险不推荐使用。
except (ZeroDivisionError, ValueError) as e:
if ExceptionTest.flag:
print("the number has some wrong")
# 捕获异常对象并打印
print(e)
else:
raise ValueError
exceptionTest = ExceptionTest()
exceptionTest.setFlag(True)
exceptionTest.method()
5、else与finally
使用finall的最主要原因为在发生异常之后可以对一些资源进行关闭,例如网络资源,IO资源。
# 异常处理中的else与finally
# 在未发生异常时,会执行else中的语句,不管程序发不发生异常都会执行finally中的语句
class ExceptionTest:
flag = False
def setFlag(self, flag):
ExceptionTest.flag = flag
def method(self):
try:
x = int(input("please input the first number:"))
y = int(input("please input the second number:"))
print("x / y = ", x / y)
except (ZeroDivisionError, ValueError) as e:
if ExceptionTest.flag:
print("the number has some wrong")
# 捕获异常对象并打印
print(e)
else:
raise ValueError
else:
print("未发生异常")
finally:
print("进行清理工作")
exceptionTest = ExceptionTest()
exceptionTest.setFlag(True)
exceptionTest.method()
结果
please input the first number:12
please input the second number:0
the number has some wrong
division by zero
进行清理工作