Python--错误和异常

本文深入探讨Python中的异常处理机制,包括语法错误、运行时异常、异常处理语法、自定义异常及finally子句的使用,旨在帮助读者理解如何有效处理程序运行中的错误。

一、语法错误

print while True:

在这里插入图片描述
如果错误信息是以SyntaxError开头,这就是说明Python解释器认为这是一个语法错误,同时Python会很贴心地提示你在哪个文件的第几行的第几个字符开始出错(虽然有时候错误位置可能不准确)。语法错误通常意味着我们使用的Python书写格式或者使用方式式不正确的,Python不会完整运行带有语法错误的程序。这时候我们只需要安装提示查阅Python基础语法,修改相关错误内容即可。


二、异常

即使Python程序的语法是正确的,但是在运行的时候也可能会发生一些预想之外的错误。运行时检测到的错误被称为异常,有些错误可能并不是致命的,但如果程序对大多数的异常都不做处理,Python解释器会输出异常信息到屏幕上并终止程序。例如:

异常示例1

# 错误
print(1/0)

# 不会被执行
print("Hello World!")

在这里插入图片描述
异常示例2

print(4*a)

在这里插入图片描述

异常示例3

"1" + 0

在这里插入图片描述
异常示例4

d={}
d["world"]

在这里插入图片描述

Python中还存在其他形形色色的异常类型,可自行查阅官方文档了解更多Python内置的异常。


三、处理异常

异常是在程序运行时才会检测到的错误,有时候是不可预期的。有些错误也不是致命的,我们并不希望它们影响程序的完整运行,Python提供了友善的方式可以让我们处理一些异常。

例如:我们不断让用户输入数字并检测用户输入的是否是数字

while True:
	number = int(input("请输入一个数字:"))

运行这个例子会让用户不断地输入内容(按下Ctrl+C组合键可以停止该程序),如果用户输入的是数字,则程序会不断地运行;如果用户输入的是非数字内容,则程序会输出错误并且退出:

在这里插入图片描述
我们看到输出的错误信息是ValueError,这告诉我们“abcd”没办法转化为数字。我们并不能预见用户会输入什么数据,只有在程序运行的时候用户输入了错误内容,程序才会出错。这是一个典型的异常,如果我们并不希望因为用户输入了一些不符合规范的数据而使程序出错不能运行(例如用户在手机APP上输入一下内容之后APP突然异常退出,这是非常不友好的体验),这时候我们就需要处理这些异常,确保程序不会无故退出。

while True:
	try:
		number = int(input("请输入一个数字"))
	except ValueError:
		print("您输入的恐怕不是一个有效的数字!请重试")

在这里插入图片描述
关键字tryexcept用于捕获异常并让我们运行相应的代码去处理异常,try-except语法如下:

try:
	业务语法块
except 异常类似:
	处理异常语法块

try业务语法块中,产生任何的异常都会终止业务语法块并跳转到except匹配异常类型。如果匹配得上,则运行处理异常的语法块,否则程序就报错退出,例如:

while True:
	try:
		number = int(input("请输入一个数字:"))
	except KeyError:
		print("KeyError")
	except ValueError:
		print("ValueError")
	except KeyboardInterrupt:
		print("用户终止,退出程序")
		exit()
	except Exception as e:
		print("未知错误", e)

如果有多个except,那么Python解释器会逐个匹配except后的异常类型,如果匹配到则运行相应的处理异常的语法块,如果没有匹配到则输出异常并退出程序。由于大部分的异常都是从Exception这个父类继承过来的,所以如果匹配的异常类型是Exception,就总是可以匹配到所有异常。


四、抛出异常

使用raise语句在Python中抛出一个指定的异常,例如:

raise Exception("这是错误信息")

手动抛出异常的时候,我们可以使用这个方法提示用户程序哪里出现了问题。之前碰到的TypeErrorValueErrorNameError等异常都是系统内建的异常。Python中内建了许多异常,常见的异常如下:

异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是Ctrl+C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(Generator)发生异常来通知退出
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点数计算错误
OverflowError数值运算超过最大限制
ZeroDivisionError除(或取模)零(所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(Index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python解释器不是致命的)
NameError为声明/初始化对象(没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak Reference)试图访问已经垃圾回收了的对象
RuntimeError一般运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython语法错误
IndentationError缩进错误
TabErrorTab和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的操作
UnicodeErrorUnicode相关的错误
UnicodeDecodeErrorUnicode解码时的错误
UnicodeEncodeErrorUnicode编码时的错误
UnicodeTranslateErrorUnicode转换时的错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(Runtime Behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

五、finally子语

Python中的finally子句需要和try子句一起使用,finally子句在异常处理中的作用是:无论是否有异常或者是否捕获了异常,finally子句都会保证执行。例如:

try:
	print(1/0)
except ZeroDivisionError:
	print("除零错误")
finally:
	print("finally子句")

# 输出
# 除零错误
# finally子句

六、自定义异常

Python有许多内建的异常类,内建的异常类可以满足大部分需求,但还是会有Pyhton内建的异常无法满足需求的时候,Python也提供了自定义异常的方法。

自定义异常应该继承自Exception类,可以是直接继承,也可以是间接继承。例如:

class MyException(Exception):
	def __init__(self):
		pass
	
	def __str__(self):
		return "这是一个自定义异常"

def raise_customer_exception():
	raise MyException()

raise_customer_exception()

在这里插入图片描述

class MyException(Exception):
	def __init__(self):
		pass
	
	def __str__(self):
		return "这是一个自定义异常"

def raise_customer_exception():
	raise MyException()

try:
	raise_customer_exception()
except MyException as e:
	print("Error!", e)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值