异常基础

1. 什么是异常

跟java异常(Exception)一样,都是指在程序执行过程中发生的错误或异常情况。当程序出现异常时,会中断正常的执行流程,并转而执行异常处理的逻辑。

2. 什么情况下触发异常

异常可以由多种原因引起,例如:

  • 语法错误:代码不符合Python语法规则。
  • 运行时错误:在代码执行期间发生了错误,如除零错误、索引错误等。
  • 逻辑错误:程序逻辑错误导致了异常情况,如值错误、类型错误等。

当遇到异常时,Python会抛出相应的异常对象。

这些异常对象属于异常类的实例,它们包含有关异常的相关信息,如异常类型和错误消息。

通过捕获和处理这些异常,我们可以更好地控制程序的流程,并提供适当的错误处理机制。

3. 异常的处理

异常处理通常使用try-except语句来实现。在try块中,放置可能引发异常的代码;在except块中,指定要处理的异常类型,并提供相应的处理逻辑。如果没有匹配的except块,异常将被传递给上层调用栈,直到找到匹配的异常处理器或程序终止。

复制代码
try:
    # 可能会引发异常的代码
    result = 10 / 0  # 除以零会引发 ZeroDivisionError 异常
    print("这行代码不会被执行")
except ZeroDivisionError:
    # 处理 ZeroDivisionError 异常
    print("除零错误发生")
print("异常捕获,处理完成后继续执行")

# 输出:
# 除零错误发生
# 异常捕获,处理完成后继续执行
复制代码

4. 异常处理程序-try-except

4.1 一个除数为0的错误

复制代码
 1 def division(x, y):
 2     return x / y
 3 
 4 
 5 print(division(8, 6))  # 1.3333333333333333
 6 '''
 7 Traceback (most recent call last):
 8   File "F:\python\base\base\037异常\异常01-一个除数为0的错误.py", line 6, in <module>
 9     print(division(5, 0))
10           ^^^^^^^^^^^^^^
11   File "F:\python\base\base\037异常\异常01-一个除数为0的错误.py", line 2, in division
12     return x / y
13            ~~^~~
14 ZeroDivisionError: division by zer
15 '''
16 print(division(5, 0))  # 报错
17 
18 print(division(6, 3))  # 报错后,程序终止,此句未执行
复制代码

当一个程序发生了异常,程序就会将异常传递给上层调用栈,直到找到匹配的异常处理器或程序终止。如果没有处理线程或程序将会终止。

4.2 语法

1 try:
2     # 可能会引发异常的代码块
3     # ...
4 except 异常类:  # 如果没有异常类,则捕获所有异常
5     # 异常处理代码
复制代码
 1 def division(x, y):
 2     try:
 3         return x / y
 4     except ZeroDivisionError:
 5         print("除数不可为0")
 6 
 7 
 8 print(division(8, 6))  # 1.3333333333333333
 9 print(division(5, 0))  # 报错被捕获,但函数还是有返回值,为None
10 
11 print(division(6, 3))  # 异常被捕获处理,程序没有终止,因此此句执行了.输出:2.0
复制代码

5. 异常处理-try-except-else

5.1 语法

1 try:
2     # 可能会引发异常的代码块
3     # ...
4 except ExceptionType1:   # 如果没有异常类,捕获所有的异常
5     # 处理 ExceptionType1 类型的异常的代码
6     # ...
7 else:
8     # 在没有引发异常时执行的代码块
复制代码
def division(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不可为0")
    else:  # 程序无异常,返回结果
        print("程序无异常发生")
        return result


print(division(8, 6))  # 1.3333333333333333
print(division(5, 0))  # 报错被捕获,但函数还是有返回值,为None

print(division(6, 3))  # 异常被捕获处理,程序没有终止,因此此句执行了.输出:2.0

'''
输出:
    1.3333333333333333
    除数不可为0
    None
    程序无异常发生
    2.0
'''
复制代码

else块(可选):在try块中的代码没有引发任何异常时执行的代码块。

else语句场景:

  1. 需要处理异常以外的代码逻辑:else块中的代码会在try块中的代码没有引发任何异常时执行。这样可以将正常的代码逻辑放在else块中,而将异常处理逻辑放在except块中,使代码更加清晰和可读。

  2.  异常处理与成功处理分离:else块中的代码只会在没有异常发生时执行,因此可以将对于异常情况的处理与正常情况的处理分离开来,提高代码的可读性和可维护性。

 

复制代码
 1 '''
 2 通过try-except-else统计一个文件中的字数
 3 '''
 4 test_file = "except文件.txt"
 5 
 6 try:
 7     #  使用encoding='utf-8',避免UnicodeDecodeError异常
 8     with open(file=test_file,encoding='utf-8') as file_obj:  # UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2: illegal multibyte sequence
 9         data = file_obj.read()
10 except FileNotFoundError:
11     print(f"找不到文件{test_file}")
12 else:
13     word_list = data.split()
14     print(f"{test_file}文件的字数是:{len(word_list)}")
复制代码

 

posted @   Allen_Hao  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示