python异常

异常

假设有复制文件的需求:

try:
	copyFile("path1","path2")
except:
	print("Error")

如果使用异常处理,上面的过程中哪怕出现问题,程序也不会因为这些异常被迫终止,即只影响异常的代码段而不影响其他过程的运行。

image

从除0的异常开始

众所周知,除零是会出错的:

a = 1/0

image
因此我们需要在可能出现这样的代码段加入异常处理:

try:
	a = 3/0 # 这里写可能除0的逻辑运算代码段
except:
	print("ZeroDivisionError: division by zero")

这样在try里面出错的时候会直接跳转到except

try...单个except结构

try:
	可能发生异常的语句块
except BaseException [as e]:
	异常语句处理块

异常处理时会跳过异常的代码到try底部所有的代码段:

try:
	print("stp1")
	a = 3/0 # 异常发生的语句
	print("stp2")
except BaseException as e:
	print("stp3")
	print(e)

print("stp4")

image

except中的语句是可以省略的:

try:
	print("stp1")
	a = 3/0 # 异常发生的语句
	print("stp2")
except BaseException as e:
	pass # pass
print("stp4")

image

try...多个except结构

一般结构为

try:
	可能发生异常的语句块
except Exception1: # 异常类型1的处理办法
	语句
except Exception2: # 异常类型2的处理办法
	语句
except BaseException [as e]: # 最后加上可能没考虑到的异常
	异常语句处理块

下面的一个输入计算程序,为了应对不同的错误,给予了不同的处理方法

try:
	a = input("输入一个被除数")
	b = input("输入一个除数")
	c = float(a) / float(b)
	print(c)
except ZeroDivisionError: 
	print("除零错误")
except ValueError: # 输了个不是数字的字符串
	print("不能将字符串转化为数字")
except NameError: # 使用未定义变量
	print("变量不存在")
except BaseException as e:
	print(e)

异常里面还有else和final语句,else可能用得上,final大概是不会用了。

try:
	b = int(input("输入一个数字")) # 假设不会报错
	a = 3/b
except BaseException as e:
	print(e)
else:
	print("正常执行完了")

常见的异常汇总

image
image
image

traceback

可以导入traceback模块打印详细异常信息

import traceback
try:
	print("stp1")
	num = 1/0
except:
	traceback.print_exc()
	
	
'''下面是保存到文件中的操作'''
import traceback
try:
	print("stp1")
	num = 1/0
except:
	with open("path","a") as f:
		traceback.print_exc(file=f)

image

自定义异常类

class AgeError(Exception): # 继承Exception
	def __init__(self,errorInfo):
		Exception.__init__(self)
		self.errorInfo = errorInfo
	def __str__(self):
		return str(self.errorInfo) + ",年龄错误"

if __name__ == "__main__":
	age = int(input())
	if age<1 or age>150:
		raise AgeError(age) # 抛出异常
	else:
		print("正常的年龄")
posted @ 2021-08-13 09:23  Lecoww  阅读(42)  评论(0)    收藏  举报