目录
1. 错误类型
2. 异常(Exceptions)
2.1 try和except 块
2.2 捕获特定类型的异常
2.3 多个 except 块
2.4 else 和 finally 语句
3. 抛出异常
3.1 自定义异常
4. 异常处理的最佳实践
结语
在学Python以来,你敲的代码已经有很多了,有时候你会发现,程序执行过程中可能会遇到的各种问题或情况,遇到各种bug。每当这个时候,这就会查看报错的信息,这时候就会发生两种情况:错误、异常。
两种类型如下表:
类型 | 描述 | 示例 |
错误 (Error) | 程序在运行期间遇到的严重问题,导致程序无法继续执行。一旦出现错误,程序立即停止执行并抛出错误信息。 | 语法错误:代码中存在语法错误,如拼写错误或不正确的语法结构。 |
类型错误:操作或函数应用于不适当类型的数据。 | ||
逻辑错误:程序在逻辑上不符合预期,导致意外行为或结果。 | ||
异常 (Exceptions) | 一种更加可控和处理的情况,当程序遇到意外或不正常的情况时会引发异常。这些异常可以被程序捕获并进行适当的处理。 | IndexError:尝试访问列表中不存在的索引位置。 |
FileNotFoundError:试图打开不存在的文件。 | ||
ZeroDivisionError:除数为0的情况。 |
对于这两种报错信息的处理也需要不同的方式。
首先是错误,这一类报错,往往是语法的问题,比如说当你写print()的时候,写错了:
对于这类错误,下面会讲,但是解决的办法就是,你需要仔细!!!!
其次就是异常,这类错误,你需要学习今天的教程:
1. 错误类型
Python提供了许多内置的报错的异常类型,每种类型对应不同的错误情况。以下是一些常见的内置异常类型,以及它们的含义和常见原因:
- SyntaxError(语法错误)
- 含义:当Python代码的语法有误时引发。
- 常见原因:拼写错误、缺少冒号、缩进错误等。
# 示例 SyntaxError
print "Hello, World!"
- IndentationError(缩进错误)
- 含义:当代码的缩进格式不正确时引发。
- 常见原因:在代码块中混合使用了制表符和空格、缩进不一致等。
# 示例 IndentationError
def my_function():
print("Indentation Error")
- NameError(名称错误)
- 含义:当使用一个未定义的变量或函数时引发。
- 常见原因:拼写错误、变量/函数未声明就被使用等。
# 示例 NameError
print(my_variable)
- TypeError(类型错误)
- 含义:当操作或函数应用于不适当类型的对象时引发。
- 常见原因:尝试对不同类型的对象执行不兼容的操作、传递错误类型的参数等。
# 示例 TypeError
num = 10
print("Number: " + num) # 试图将整数和字符串连接
- ZeroDivisionError(除零错误)
- 含义:当尝试除以零时引发。
- 常见原因:明确或意外地尝试除以0。
# 示例 ZeroDivisionError
result = 10 / 0
- FileNotFoundError(文件未找到错误)
- 含义:当试图打开不存在的文件时引发。
- 常见原因:文件路径错误、文件被移动或删除等。
# 示例 FileNotFoundError
with open("non_existent_file.txt", "r") as file:
content = file.read()
- ValueError(值错误)
- 含义:当函数接收到一个正确类型但不适合的值时引发。
- 常见原因:传递给函数的参数值超出了预期的范围或不符合函数的要求。
# 示例 ValueError
int("abc") # 试图将无法转换为整数的字符串转换为整数
以上只是一些常见的内置异常类型示例。这些错误类型,都会在控制台进行输出。
2. 异常(Exceptions)
与错误不同,异常是一种更加可控和处理的情况。当程序遇到意外或不正常的情况时,会引发异常。这些异常可以被程序捕获(catch)并进行适当的处理,使程序能够继续执行。
在Python中,提供了一种叫做“assert(断言)”的方式,来判断一个表达式,在表达式条件为 false 的时候触发异常。
下面讲解异常处理办法:
2.1 try
和except
块
使用 try/except 语句来进行错误处理,语法如下:
try:
# 可能会引发异常的代码块
# 这里放置你希望捕获异常的代码
except Exception:
# 发生异常时的处理代码
# 在这里你可以处理异常,或者进行其他操作
结构如如下:
try 子句中的代码块会被尝试执行。如果执行过程中发生异常,则会跳到 except 子句执行。
except 子句可以指定要处理的异常类型。如果异常类型与 except 子句指定的类型匹配,则会执行该子句中的代码块。
示例代码:
try:
x = 1 / 0
except ZeroDivisionError as e:
print("发生了零除错误:", e)
# 输出:发生了零除错误: division by zero
2.2 捕获特定类型的异常
有时候,你可能只想捕获某系个特定类型的异常,以便更精确地处理这些异常。这时,可以通过指定 except
后面的异常类型来实现。
try:
# 可能会引发异常的代码块
except SpecificExceptionType:
# 处理特定类型的异常
except AnotherSpecificExceptionType:
# 处理另一种特定类型的异常
except (Type1, Type2):
# 处理多种类型的异常
except Exception:
# 处理所有其他类型的异常
- 你可以列出一个或多个
except
块,每个except
块指定要处理的特定异常类型。 - 如果发生的异常类型与
except
块中指定的类型匹配,Python 将执行该except
块中的代码。 - 如果没有匹配的
except
块,那么异常将继续向上层传播。
示例代码:
# 捕获 ZeroDivisionError 以处理除零错误
try:
x = 10 / 0 # 尝试进行除以零的操作
except ZeroDivisionError:
print("除以零错误发生了!")
except ArithmeticError:
print("数学错误发生了!")
第一个except ZeroDivisionError
块处理除以零错误。
第二个except ArithmeticError
块是为了捕获更一般的算术错误,但它并不会捕获除以零错误,因为ZeroDivisionError
是ArithmeticError
的子类。
2.3 多个 except
块
有时候,具体的异常类型需要编写不同的处理逻辑,那就可以采用多个 except
块来处理不同类型的异常。
语法如下,按顺序列出 except
块以处理特定的异常情况:
try:
# 可能会引发异常的代码块
except SpecificExceptionType1:
# 处理特定类型1的异常
except SpecificExceptionType2:
# 处理特定类型2的异常
except AnotherExceptionType:
# 处理另一种异常类型
except Exception:
# 处理所有其他类型的异常
在这个结构中:当一个 except
块处理了一个异常后,程序将不再继续尝试匹配后续的 except
块。因此,应该按照希望处理的特定异常的顺序列出 except
块。
示例代码:
try:
x = int(input("请输入一个整数: "))
result = 10 / x
except ValueError:
print("输入的不是一个有效的整数!")
except ZeroDivisionError:
print("除以零错误发生了!")
except Exception:
print("发生了其他类型的异常!")
上面的代码中:
- 如果用户输入的不是一个整数,那么
ValueError
异常将被捕获并处理。 - 如果用户输入的是零,那么
ZeroDivisionError
异常将被捕获并处理。 - 如果用户输入的是一个非零整数,那么不会引发异常,程序将继续执行。
2.4 else
和 finally
语句
else
语句:当没有异常发生时执行的代码块,else
语句用于指定在 try
块中没有发生任何异常时要执行的代码。通常用于处理只在没有异常时才应该执行的操作。
语法如下:
try:
# 可能会引发异常的代码块
except ExceptionType1:
# 处理特定类型1的异常
except ExceptionType2:
# 处理特定类型2的异常
else:
# 没有异常时要执行的代码
结构示意图:
示例代码:
try:
x = int(input("请输入一个整数: "))
except ValueError:
print("输入的不是一个有效的整数!")
else:
print("您输入的是一个整数。")
代码解释:如果用户输入的是一个整数,else
语句将会执行,打印出 "您输入的是一个整数。
如果用户输入的不是一个整数,ValueError
异常将被捕获并处理。
finally
语句:无论是否发生异常都会执行的清理代码块
finally
语句用于指定在 try
块结束时必须执行的代码,无论是否发生了异常。这个代码块通常用于执行清理操作,比如上一篇文章中,我们讲到关闭文件或数据库连接等。
语法如下:
try:
# 可能会引发异常的代码块
except ExceptionType1:
# 处理特定类型1的异常
except ExceptionType2:
# 处理特定类型2的异常
finally:
# 无论是否发生异常都要执行的代码
结构示意图:
示例代码:
try:
f = open("example.txt", "r")
# 读取文件内容等操作
except FileNotFoundError:
print("文件未找到!")
finally:
f.close() # 确保文件在最终结束时被关闭
代码解释:不管是否发生 FileNotFoundError
异常,finally
块中的 f.close()
语句都会确保打开的文件被关闭。
那么i前面讲了 else和finally,一句话概括就是:else
语句用于处理没有引发异常时的代码,而 finally
语句用于确保一些操作(如资源清理)无论是否发生异常都会执行。
3. 抛出异常
在编程的时候,有些特殊请款,比如,某些情况下应该引发异常,那么,你可以使用 raise
语句来主动抛出异常。
比如说,某函数要检查传入的参数 x
是否为负数。如果是负数,它将抛出一个 ValueError
异常,并显示一个错误消息。那么你就可以这么写:
def some_function(x):
if x < 0:
raise ValueError("x 不能是负数")
# 其他代码
# 调用函数并传入负数
try:
some_function(-5)
except ValueError as e:
print(e)
3.1 自定义异常
你也可以定义自己的异常类,这样可以更好地找到和标识不同类型的错误。
class CustomError(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return f"CustomError: {self.message}"
def some_function(x):
if x < 0:
raise CustomError("x 不能是负数")
# 其他代码
# 调用函数并传入负数
try:
some_function(-5)
except CustomError as e:
print(e)
上面的例子中,CustomError
是一个继承自 Exception
的自定义异常类。它有一个 message
属性来存储错误消息,并重写了 __str__
方法以便打印有意义的错误信息。
4. 异常处理的最佳实践
现在我们来通过几个例子讲讲异常的最佳实践案例。
实践类型 | 说明 |
---|---|
记录异常信息 | 在捕获异常时,最好记录异常的详细信息,以便后续调试和分析。 |
避免捕获所有异常 | 尽量避免使用裸露的 except 语句,因为它会捕获所有异常,包括你可能没有预料到的异常。这会隐藏程序中的潜在错误。 |
在适当的时候引发异常 | 当检测到某些情况不符合预期时,应该使用 raise 引发异常,以便让调用者或上层代码知道发生了什么问题。 |
处理特定异常 | 使用多个 except 块来处理不同类型的异常,使得代码更具可读性和可维护性。 |
使用 else 和 finally | else 用于处理没有异常时的情况,finally 用于确保清理操作得到执行。 |
示例 1:记录异常信息
import logging
try:
result = 10 / 0
except ZeroDivisionError as e:
logging.error(f"发生除零错误:{e}")
示例 2:避免捕获所有异常
try:
# 可能会引发异常的代码
except SpecificException:
# 处理特定异常
except AnotherSpecificException:
# 处理另一种特定异常
except Exception as e:
logging.error(f"发生异常:{e}")
示例 3:引发异常
def calculate_age(age):
if age < 0:
raise ValueError("年龄不能是负数")
# 其他代码
try:
calculate_age(-5)
except ValueError as e:
logging.error(f"发生值错误:{e}")
示例 4:使用 else
和 finally
try:
f = open("example.txt", "r")
# 读取文件等操作
except FileNotFoundError as e:
logging.error(f"文件未找到:{e}")
else:
print("文件读取成功!")
finally:
f.close()
结语
在 Python 中,想要你的代码可靠、健壮代。良好的异常处理必不可少。如果你敏感一点,你就会发现存在错误和异常处理的代码更容易阅读、调试和维护。只需要通过使用 try
、except
、raise
、自定义异常等操作。你就可以很好地控制程序的行为,使代码在面对各种情况时表现更加稳健和可靠。
如果大家跟着我的代码一起学习,相信你一定会有所收获。我们下一篇文章仍然会继续Python高阶特性的讲解,欢迎大家和我一起继续学习、记录python的下一个知识点。
如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!
往期学习:
Python安装教程(版本3.8.10)windows10
Linux系统:安装Conda(miniconda)
Conda快速安装的解决方法(Mamba安装)
VSCode安装教程(版本:1.87.0)Windows10
Python基础语法:从入门到精通的必备指南
Python的基本数据类型
Python数据类型间的转换(隐式、显式)-CSDN博客
Python基础知识:运算符详解-CSDN博客
Python基础知识:数字类型及数学函数详解-CSDN博客
Python字符串操作及方法详解!一篇就搞定!-CSDN博客
Python列表及其操作详解,从此不再迷茫!-CSDN博客
Python元组(Tuple)深度解析!
Python字典的使用技巧(一篇详解)
Python条件控制深度解析,成为编程必备
Python循环语句全解析(附实战演练)
Python函数高效编程技巧,提升你的代码效率!
Python模块和包全解析,一篇文章就够!
Python新手必学:输入输出全攻略