python第十九节错误与异常

本文详细解释了Python中的错误分类(语法错误和运行时异常),介绍了内置异常的使用,以及try-except块的不同用法,包括嵌套、else、as和finally。此外,还讲解了如何主动抛出异常和使用assert进行条件断言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误分类

错误一般可分为两种:

  • 语法错误:又称解析错误(语法分析器检查到的错误)
  • 异常:在运行时检测到的错误(程序的语法是正确的)

内置异常

查看内置异常

import builtins

print(dir(builtins))

在这里插入图片描述
这里面带error都是内置异常

处理异常

try…except…

  • 如果在执行 try 子句时没有异常发生,则不会执行 except 子句
  • 如果 try 子句发生了异常,则跳过该子句中剩下的部分,执行 except 子句
  • 如果 except 子句没有指定异常类型,则可以处理 try 中的所有异常类型
  • 如果 except 子句指定了异常类型,则只能处理对应的异常类型(指定多个异常类型时,可以用元组来表示)
  • 如果一个异常没有与任何的 except 匹配,则报错
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
	except:
		print('try中发生异常')


div(2, 1)
div(2, 0)
div('2', 2)
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
		
	except ZeroDivisionError:
		print('try中发生了除数为0的异常')
		
	except TypeError:
		print('try中发生了类型异常')


div(2, 1)
div(2, 0)
div('2', 2)
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
	except (ZeroDivisionError, TypeError):
		print('try中发生了除数为0的异常或者类型异常')


div(2, 1)
div(2, 0)
div('2', 2)

try … except … 嵌套

- 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中
def div(a, b):
	try:
		try:
			c = a / b
			print(f"{a} / {b} = {c}")
		except ZeroDivisionError:
			print('try中发生了除数为0的异常')
		except:
			print('发生了除0以外的异常')


div('2', 2)

try … except … else…

  • else 子句必须放在所有的 except 子句之后
  • else 子句将在 try 子句没有发生任何异常的时候执行
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
	except ZeroDivisionError:
		print('try中发生了除数为0的异常')
	except:
		print('发生了除0以外的异常')
	else:
		print('try中没有异常')


div(2, 1)
div(2, 0)
div('2', 2)

try … except … as …

  • as 后面为异常实例对象的名称

def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
# e:ZeroDivisionError('division by zero')
	except ZeroDivisionError as e:
		print(isinstance(e, ZeroDivisionError))
		print(e)
		print(ZeroDivisionError('division by zero'))


div(2, 0)

try … finally …

  • finally 子句将作为 try 语句结束前的最后一项任务被执行
  • 不论 try 语句是否产生了异常都会被执行
  • 如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子句中的return 语句的返回值,而非来自 try 子句中的 return 语句的返回值
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
		
	finally:
		print("执行finally子句")


div(2, 0)

def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
	except:
		print('try中发生异常')
	finally:
		print("执行finally子句")


div(2, 0)
def div(a, b):
	try:
		return 1
	finally:
		return 2

print(return_num())
def div(a, b):
	try:
		c = a / b
		print(f"{a} / {b} = {c}")
	except:
		print('except在发生异常时执行')
	else:
		print('else在没有异常时执行')
	finally:
		print('finally在任何情况下都会被执行')
		
		
div(2, 1)
div(2, 0)

抛出异常

  • raise 语句可以主动的抛出异常
  • raise 后面可以是 异常实例 / 异常类 / 没有内容
def div(a, b):
	if b == 0:
		raise ZeroDivisionError('除数为0')
	c = a / b
	print(f"{a} / {b} = {c}")

div(2, 1)
div(2, 0)
def div(a, b):
	if b == 0:
		raise ZeroDivisionError
		
	c = a / b
	print(f"{a} / {b} = {c}")


div(2, 1)
div(2, 0)
def div(a, b):
	if b == 0:
		raise
		
	c = a / b
	print(f"{a} / {b} = {c}")

div(2, 1)
div(2, 0)

assert断言

  • assert 用于判断一个表达式,在表达式为 False 的时候触发 AssertionError 异常
  • assert expression 等价于if not expression: raise AssertionError
  • assert expression [, arguments]等价于:if not expression: raise AssertionError(arguments)
num = int(input("请输入一个整数: "))
assert num != 1
print("断言条件为True, 用户没有输入1")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙_尧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值