

Python入门:Python3 错误和异常全面学习教程
Python入门:Python3 错误和异常全面学习教程,系统讲解了Python3中错误与异常的相关知识。文章先区分了语法错误与异常的差异,前者因代码格式问题导致解析失败,后者是运行时出现的意外情况。接着介绍了常见异常类型,如TypeError、ValueError等及其触发场景。核心部分阐述了异常处理机制,包括try-except语句捕获异常、else子句处理无异常情况、finally子句执行清理操作,还提及raise主动抛异常和自定义异常类的方法。此外,文章结合实例说明最佳实践,帮助开发者从识别错误根源到高效处理异常,提升代码健壮性。

前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。


🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。

🌐 前篇文章咱们讲解了 Python入门:Python3 OS 文件/目录方法全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们学习 Python3 错误和异常全面学习教程,下面开始吧!
在 Python 编程的学习过程中,错误和异常是我们必然会遇到的问题。初学者往往会被突如其来的报错信息搞得手足无措,但实际上,只要掌握了错误和异常的相关知识,就能轻松应对这些问题。本文将详细介绍 Python3 中的错误和异常,包括它们的类型、识别方法以及处理方式,帮助你更好地理解和运用 Python。
一、错误与异常的基本概念
Python 中有两种容易辨认的问题:语法错误和异常。
1. 语法错误
语法错误,也称为解析错,是初学者最常遇到的问题。当 Python 解析器无法理解我们编写的代码时,就会抛出语法错误。
例如:
#注意这是一个死循环,如果想停止Ctrl+C就可以了
while True print('Hello world')

在这个例子中,print() 函数前面缺少了一个冒号 :,导致 Python 解析器无法正确解析代码,从而抛出了 SyntaxError。解析器会指出出错的一行,并在最先找到错误的位置标记一个箭头,帮助我们定位问题。
2. 异常
即使 Python 程序的语法是正确的,在运行过程中也可能会出现错误,这种在运行期检测到的错误被称为异常。
大多数异常不会被程序自动处理,而是以错误信息的形式显示出来。例如:
10 * (1/0) # 0 不能作为除数,触发异常

4 + spam*3 # spam 未定义,触发异常

>>> '2' + 2 # int 不能与 str 相加,触发异常

异常以不同的类型出现,上述例子中的异常类型分别是 ZeroDivisionError、NameError 和 TypeError。错误信息的前面部分会显示异常发生的上下文,并以调用栈的形式展示具体信息,有助于我们追踪问题根源。
另外,Python 中的 assert(断言)也会触发异常。assert 用于判断一个表达式,当表达式条件为 false 时,就会触发异常。
二、异常处理方法
为了让程序在遇到异常时能够继续执行,而不是直接崩溃,我们需要对异常进行处理。Python 提供了多种异常处理机制,其中最常用的是 try/except 语句。
1. try/except 语句
try/except 语句可以捕捉并处理异常。其基本语法如下:
try:
# 可能会发生异常的代码块
except 异常类型1:
# 处理异常类型1的代码块
except 异常类型2:
# 处理异常类型2的代码块
...
工作原理
- 首先执行
try子句(try和except之间的语句)。 - 如果没有异常发生,忽略
except子句,try子句执行后结束。 - 如果在执行
try子句过程中发生异常,try子句余下部分被忽略。若异常类型与except之后的名称相符,对应的except子句将被执行。 - 若异常未与任何
except匹配,该异常会传递给上层的try中。
例如,让用户输入一个合法整数,若输入非数字则提示重新输入:
while True:
try:
x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
多个 except 子句
一个 try 语句可以包含多个 except 子句,分别处理不同特定异常,最多只有一个分支会被执行。
例如:
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
其中,最后一个 except 子句可以忽略异常名称,作为通配符使用,可打印错误信息后再次抛出异常。
处理多个异常
一个 except 子句可以同时处理多个异常,将这些异常放在一个括号里组成元组即可。例如:
except (RuntimeError, TypeError, NameError):
pass
2. try/except…else 语句
try/except 语句还有一个可选的 else 子句,必须放在所有 except 子句之后。else 子句在 try 子句没有发生任何异常时执行。
例如,判断文件是否可打开,若正常打开则读取文件内容:
import sys
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
使用 else 子句比把所有语句都放在 try 子句里更优,可避免一些 except 无法捕获的意外异常。
此外,异常处理不仅能处理 try 子句中直接发生的异常,还能处理子句中调用的函数(甚至间接调用的函数)抛出的异常。例如:
def this_fails():
x = 1/0
try:
this_fails()
except ZeroDivisionError as err:
print('Handling run-time error:', err)
上面代码执行:
Handling run-time error: division by zero
3. try-finally 语句
try-finally 语句无论是否发生异常,都会执行最后的代码。
例如:
try:
runoob()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('这句话,无论异常是否发生都会执行。')
三、抛出异常
Python 使用 raise 语句抛出一个指定的异常,语法格式如下:
raise [Exception [, args [, traceback]]]
例如,若 x 大于 5 就触发异常:
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
执行以上代码会触发异常:
Traceback (most recent call last):
File "test.py", line 3, in <module>
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
raise 的唯一参数指定要抛出的异常,它必须是一个异常的实例或者异常的类(即 Exception 的子类)。
若只想知道是否抛出异常,不想处理它,可使用简单的 raise 语句再次抛出:
>>> try:
raise NameError('HiThere') # 模拟一个异常。
except NameError:
print('An exception flew by!')
raise
# 执行以上代码会触发异常:
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
四、用户自定义异常
我们可以通过创建新的异常类来定义自己的异常,异常类需继承自 Exception 类,可以直接继承或间接继承。
例如:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)
#代码执行结果:My exception occurred, value: 4
raise MyError('oops!')

当一个模块可能抛出多种不同异常时,通常的做法是为该包建立一个基础异常类,再基于这个基础类为不同错误情况创建子类:
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多数异常的名字都以“Error”结尾,与标准异常命名保持一致。
五、定义清理行为
try 语句还有一个可选子句,用于定义无论何种情况都要执行的清理行为。
例如:
try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
# 执行结果:
Goodbye, world!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
不管 try 子句中是否发生异常,finally 子句都会执行。
若一个异常在 try 子句(或 except 和 else 子句)中被抛出,且没有任何 except 截住它,该异常会在 finally 子句执行后被抛出。
再看一个更复杂的例子(同一个 try 语句包含 except 和 finally 子句):
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
divide(2, 1)
divide(2, 0)
divide("2", "1")

六、预定义的清理行为
一些对象定义了标准的清理行为,当不再需要它们时,无论系统是否成功使用过,都会执行这些清理行为。
例如,尝试打开一个文件并将内容打印到屏幕上:
for line in open("myfile.txt"):
print(line, end="")
这段代码的问题是执行完毕后,文件会保持打开状态而不关闭。
使用 with 语句可以保证诸如文件之类的对象在使用完后一定会正确执行清理方法:
with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上代码执行完毕后,即使处理过程中出现问题,文件 f 也总会被关闭。
总结
本文详细介绍了 Python3 中的错误和异常,包括语法错误和异常的区别、异常处理的各种方法(try/except、try/except...else、try-finally)、如何抛出异常、自定义异常以及清理行为的定义等内容。掌握这些知识,能帮助你在 Python 编程中更好地处理各种错误和异常,提高程序的健壮性和可靠性。希望本文对你的 Python 学习有所帮助!
💡下一篇咱们学习 Python3 面向对象全面学习教程!
附录:扩展学习资源
- 官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
- 本专栏特色资源:
- 代码资源仓库:CSDN专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”)
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_43151418/article/details/150062214




