工作中,程序遇到的情况不可能完美。比如:程序要打开某个
文件,这个文件可能不存在或者文件格式不对;程序在运行
着,但是内存或硬盘可能满了等等。
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们
称之为异常,英文是: Exception ,意思是例外。遇到这些例外情况,
或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出,
而不至于程序崩溃呢?我们本章就要讲解这些问题。
try…一个except结构
try…except 是最常见的异常处理结构。结构如下:
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
try:
a = input("请输入被除数:")
b = input("请输入除数:")
c = float(a)/float(b)
print(c)
except ZeroDivisionError:
print("异常:除数不能为0")
except TypeError:
print("异常:除数和被除数都应该为数值类型")
except BaseException as e:
print(e)
print(type(e))
try…except…else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行
else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。
try:
a = input("请输入被除数:")
b = input("请输入除数:")
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print("除的结果是:",c)
try…except…finally 结构中, finally 块无论是否发生异常都会被执行;通常
用来释放 try 块中申请的资源。
try:
a = input("请输入一个被除数:")
b = input("请输入一个除数:")
c = float(a)/float(b)
except BaseException as e:
print(e)
else:
print(c)
finally:
print("我是finally中的语句,无论发生异常与否,都执行!")
print("程序结束!")
由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return
放到异常处理结构中,而是放到方法最后。
Python中的异常都派生自 BaseException 类
int a =3
^
SyntaxError: invalid syntax
print(a)
NameError: name 'a' is not defined
a = 3/0
ZeroDivisionError: division by zero
ValueError :数值错误
TypeError :类型错误
AttributeError :访问对象的不存在的属性
IndexError :索引越界异常
KeyError :字典的关键字不存在
#测试自定义异常类
class AgeError(Exception): #继承Exception
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo = errorInfo
def __str__(self):
return str(self.errorInfo)+",年龄错误!应该在1-150之间"
############测试代码################
if __name__ == "__main__": #如果为True,则模块是作为独立文件运行,可以执行测试代码
age = int(input("输入一个年龄:"))
if age<1 or age>150:
raise AgeError(age)
else:
print("正常的年龄:",age)