异常处理与模块
在编程中,异常是程序在运行时发生的不正常事件,通常它会打断程序指令的正常执行。对于一些优良的程
序,开发者应该在程序产生异常时,提供处理这些不正常事件的处理方法,而使程序不会因为异常的产生而阻断程序的执行或产生不可预见的结果。
在 Python 中,对异常最好的描述是:异常是因为程序出现了错误而在正常控制以外而采取的行为措施。这
个行为措施又分为两个阶段,阶段一是异常引发的错误信息,阶段二是检测阶段(或异常处理阶段)。
可以让开发人员在异常发生时更直接地控制它们,此时,开发人员不仅有检测错误的能力,还可以在它们发生时采取更可靠的补救处理措施,这样就打打提高了程序的健壮性。
python中的异常
1.捕获异常
捕获异常主要是通过 try、except、else、finally 等关键字来完成,通常情况下,捕获异常可以通过 try 语句来检测异常,注意任何在 try 语句块里的代码都会被检测,主要是检测有无异常发生。
常见的捕获异常的语法格式如下:
try: ##检测异常的代码
可能产生异常的代码
except 异常名称 1: ##对应异常 1
异常的处理代码 1
except 异常名称 2: ##对应异常 2
异常的处理代码 2
...
finally:
无论如何都会执行的代码
try:
print("abc")
print(age)
pirnt("haha")
except NameError: #名称也可以不写
print("引发一个错误")
print("helloworld")
出现异常后执行except里的语句,try里边异常后的语句不执行了,except可以写多个
else 关键字应用在 if 语句/for 中,表示当条件不满足时执行的操作,其实,else 同样适用于 try-except 捕获
异常语句中,即若没有捕获到异常,则执行 else 后的相关操作
try: ##检测异常的代码
可能产生异常的代码
except 异常名称 1: ##对应异常 1
异常的处理代码 1
except 异常名称 2: ##对应异常 2
异常的处理代码 2
...
else: #判断是否有异常!
...没有检测到到异常
try:
print("abc")
a=10/1
except NameError:
print("引发一个错误")
else:
print("没有捕获到异常")
print("helloworld")
当有捕获多个异常且需要获取到具体的某个异常描述信息时,此时就可使用下列语法:
try: ##检测异常的代码
可能产生异常的代码
except (异常名称,名称 2) as 变量名: ##对应异常,并把异常信息存储在变量中
异常的处理代码
try:
print("abc")
a=10/0
except ZeroDivisionError as msg:
print("引发一个错误:",msg)
else:
print("没有捕获到异常")
print("hello
当要捕获所有的异常信息时,此时就需要使用到Exception类,语法格式:
try: ##检测异常的代码
可能产生异常的代码
except Exception as 变量名: ##对应的所有异常,并把异常信息存储在变量中 Exception 父类
异常的处理代码
try:
print("abc")
print(name) #异常1
a=10/0 #异常2
except Exception as msg: #异常父类
print("引发一个错误:",msg)
print(type(msg)) #异常类型
else:
print("没有捕获到异常")
print("helloworld")
try-finally 语句中的 finally 后的代码是必须执行,即无论异常是否引发都要执行,此时就要使用到 finally,比如关闭文件、释放锁等,语法格式如下:
try: ##检测异常的代码
可能产生异常的代码
except 异常名称: ##对应异常
异常的处理代码
...
finally:
无论如何都会执行的代码
try:
file=open("hello.txt","r") #异常
except Exception as msg:
print("引发一个错误:",msg)
print(type(msg))
else: #如果没有异常执行的代码
print("没有捕获到异常")
finally: #最后会执行的代码
print("一定会执行的代码")
print("helloworld")
向上抛出异常指的是不对当前异常进行处理而使用 raise 关键字直接向上抛出该异常,注意:若想要让程序最终不中断,因此需要到调用处再次捕获异常并进行处理。
除了可以向上抛出 Python 内部已定义的异常类外,还可以向上抛出自定义的异常类,且此时自定义
的异常类必须是 Error 或 Exception 的子类
raise 自定义异常类名(...)
#自定义异常类
class ShowAgeError(Exception):
def __init__(self,error_msg):
print("ShowAgeError:",error_msg)
class Student:
def __init__(self):
self.__age=0
#封装
def set_age(self,age):
if 0 <= age <= 130:
self.__age = age
else:
# self.__age = 18
raise ShowAgeError("年龄值为 0-130 才正确!")
def get_age(self):
return self.__age
#测试
student=Student()
student.set_age(-18)
print(student.get_age())
模块
Python 模块(Module),是一个以.py 结尾的 Python 文件,包含了 Python 对象定义和 Python 语句。使用模块有助于逻辑的组织 Python 代码片段,通常情况下,我们把具有某些特定功能的代码分配到一个模块里,这样能使代码更好用、易懂。
在 Python 模块中,可以定义函数、类和变量,此外,模块里还可以包含可执行的代码。
需要注意的是,在 Python 中,可以使用 Python 给开发者提供的模块(Python 解释器给我们写好的模块,
os/random),如 math、time、random 等,也可以使用开发者自定义的模块(自己写,自己发布、安装)。但在使用模块前,都需要将模块通过 import 关键字导入相应的模块。