多组异常处理基础

1. 常见的内置异常类

 

 1.1 Exception

1 try:
2     # 一些代码
3 except SpecificException:
4     # 处理特定的异常类型
5 except AnotherException:
6     # 处理另一种异常类型
7 except Exception as e:
8     # 捕获其他未处理的异常,并进行适当处理
9     print(f"捕获到异常:{str(e)}")

当无法再精确确定异常类,就使用Excepion兜底。

 

1.2 AttributeError

 1 '''
 2 AttributeError是Python中的一个内置异常类,
 3 它表示访问对象属性或方法时发生了错误。当你尝试访问一个不存在的属性或方法时,就会引发AttributeError异常。
 4 '''
 5 
 6 
 7 # 1. 对象没有某个属性:当你尝试访问一个对象上不存在的属性时,会引发AttributeError异常。
 8 class MyClass:
 9     pass
10 
11 
12 obj = MyClass()
13 # AttributeError: 'MyClass' object has no attribute 'attribute'
14 print(obj.attribute)  # 这里将会引发AttributeError异常
15 
16 # 2. 模块或包没有某个属性:当你尝试从模块或包中导入一个不存在的属性时,会引发AttributeError异常。
17 import math
18 
19 #  AttributeError: module 'math' has no attribute 'unknown_func'
20 print(math.unknown_func)  # 这里将会引发AttributeError异常
21 
22 # 4. 通过try-except捕获并处理异常
23 try:
24     obj = MyClass()
25     print(obj.attribute)
26 except AttributeError:
27     print("对象没有'attribute'属性")

 1.3 FileNotFoundError

 1 '''
 2 FileNotFoundError是Python中的一个内置异常类,它表示在文件操作中发生了文件未找到的错误。
 3 当你尝试打开或操作一个不存在的文件时,就会引发FileNotFoundError异常。
 4 
 5 需要注意的是,当涉及文件操作时,还可能出现其他类型的异常,例如权限错误(PermissionError)或IO错误(IOError)。
 6 因此,在处理文件操作时,最好使用多个except块来处理不同类型的异常。
 7 '''
 8 
 9 # 1. 文件不存在:当你尝试打开一个不存在的文件时,会引发FileNotFoundError异常。
10 '''
11 Traceback (most recent call last):
12   File "F:\异常04-常见内置异常类FileNotFoundError.py", line 7, in <module>
13     with open(file='1.txt', encoding='utf-8'):
14          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
15 FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
16 '''
17 with open(file='1.txt', encoding='utf-8'):
18     pass
19 
20 
21 # 2. 当发生FileNotFoundError异常时,可以通过捕获该异常并采取相应的处理措施,例如打印错误消息、提供默认值或执行其他操作。
22 try:
23     with open(file='1.txt', encoding='utf-8'):
24         pass
25 except FileNotFoundError as e:
26     print(e)  # 打印错误信息
27 '''
28 Traceback (most recent call last):
29   File "F:\异常04-常见内置异常类FileNotFoundError.py", line 14, in <module>
30     with open(file='1.txt', encoding='utf-8'):
31          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
32 FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
33 '''
 1 try:
 2     with open(file=r'C:\Windows\System32\drivers\etc\hosts', encoding='utf-8') as my_file:
 3         print("打开文件")
 4         pass
 5 except FileNotFoundError as e:
 6     print(e)  # 打印错误信息
 7 except PermissionError as e:
 8     print(e)  # 打印错误信息
 9 finally:
10     my_file.close()

1.4 IndexError

 1 '''
 2 IndexError是Python中的一个内置异常类,它表示在使用了无效的索引或序列访问时发生了错误。
 3 当你尝试使用超出范围的索引来访问列表、元组、字符串或其他序列类型的元素时,就会引发IndexError异常。
 4 '''
 5 
 6 # 1. 列表越界:当你尝试使用一个超出列表范围的索引来访问其元素时,会引发IndexError异常
 7 my_list = [1, 2, 3]
 8 print(my_list[3])  # 这里将会引发IndexError异常  IndexError: list index out of range
 9 
10 # 2. 字符串索引错误:当你尝试使用一个超出字符串范围的索引来访问其字符时,同样会引发IndexError异常
11 my_string = "Hello"
12 print(my_string[5])  # 这里将会引发IndexError异常  IndexError: string index out of range
13 
14 # 3. 元组索引错误:与列表类似,如果你尝试使用一个超出元组范围的索引来访问其元素,也会引发IndexError异常。
15 my_tuple = (1, 2, 3)
16 
17 try:
18     print(my_tuple[3])
19 except IndexError:
20     print("列表索引超出范围")

1.5 KeyError

 1 '''
 2 KeyError是Python中的一个内置异常类,它表示在字典或类似映射对象中访问不存在的键时发生了错误。
 3 当你尝试使用一个不存在的键来访问字典中的值时,就会引发KeyError异常。
 4 '''
 5 
 6 # 1. 字典中不存在的键:当你尝试使用一个字典中不存在的键来访问其对应的值时,会引发KeyError异常
 7 my_dict = {"name": "Alice", "age": 25}
 8 print(my_dict["address"])  # 这里将会引发KeyError异常 KeyError: 'address'
 9 
10 # 2. 字典为空:如果尝试从一个空字典中访问任何键时,也会引发KeyError异常
11 empty_dict = {}
12 print(empty_dict["key"])  # 这里将会引发KeyError异常  KeyError: 'key'
13 
14 # 3. 当发生KeyError异常时,可以通过捕获该异常并采取相应的处理措施,例如提供默认值、打印错误消息或执行其他操作。
15 my_dict = {"name": "Alice", "age": 25}
16 
17 try:
18     print(my_dict["address"])
19 except KeyError:
20     print("字典中没有'address'键")

1.6 MemoryError

 1 '''
 2 MemoryError是Python中的一个内置异常类,它表示在尝试分配内存时发生了内存不足的错误。
 3 当你的程序需要分配更多内存,但系统没有足够的可用内存时,就会引发MemoryError异常。
 4 
 5 当发生MemoryError异常时,通常很难通过捕获该异常来进行处理。因为在发生内存错误之后,程序的状态可能已经无法恢复。
 6 最好的做法是确保你的程序在设计上合理地管理内存,并尽量避免出现内存错误。
 7 
 8 然而,你可以通过一些方法来缓解内存问题,如使用生成器而不是列表来生成大量数据,或者使用适当的数据结构和算法来减少内存占用。
 9 '''
10 #
11 # 1. 内存不足:当你的程序需要分配更多内存来存储数据或执行操作,但系统没有足够的可用内存时,会引发MemoryError异常
12 # large_list = [1] * 10**19  #  OverflowError: cannot fit 'int' into an index-sized integer
13 large_list = [1] * 10 ** 9
14 large_list = large_list * 1000  # 这里将会引发MemoryError异常  MemoryError
15 
16 
17 # 2. 递归深度过大:在递归函数中,如果递归的层数过多导致内存占用过高,也可能引发MemoryError异常
18 def recursive_function(n):
19     if n == 0:
20         return
21     recursive_function(n - 1)
22 
23 
24 recursive_function(10 ** 6)  # 这里可能会引发MemoryError异常

1.7 NameError

 1 '''
 2 NameError是Python中的一个内置异常类,它表示在使用未定义或不存在的名称时发生了错误。
 3 当你尝试访问一个不存在的变量、函数、类或模块时,就会引发NameError异常。
 4 '''
 5 
 6 # 1. 变量未定义:当你尝试使用一个未定义的变量时,会引发NameError异常。
 7 print(undefined_variable)  # 这里将会引发NameError异常
 8 
 9 # 2. 函数或方法未定义:当你尝试调用一个不存在的函数或方法时,也会引发NameError异常
10 undefined_function()  # 这里将会引发NameError异常
11 
12 # 3. 类或模块未定义:当你尝试访问一个不存在的类或模块时,同样会引发NameError异常
13 
14 import undefined_module  # 这里将会引发NameError异常
15 
16 # 4. 处理异常
17 try:
18     print(undefined_variable)
19 except NameError:
20     print("变量未定义")

 

1.8 SyntaxError

 1 '''
 2 SyntaxError是Python中的一个内置异常类,它表示在解析和执行Python代码时发生了语法错误。
 3 当你的代码违反了Python语法规则或存在语法问题时,就会引发SyntaxError异常。
 4 '''
 5 # 坑1. 拼写错误:当你在变量名、函数名或关键字中出现拼写错误时,会引发NameError已,而不是SyntaxError异常。
 6 # prnt("Hello, World!")  # 这里将会引发NameError异常  # NameError: name 'prnt' is not defined. Did you mean: 'print'?
 7 
 8 # 坑2. 缩进错误:Python使用缩进来表示代码块,如果你的缩进不正确,例如混合使用空格和制表符,或者缺少了必要的缩进,都会引发IndentationError,而不是SyntaxError异常。
 9 # def my_function():
10 # print("Hello, World!")  # IndentationError: expected an indented block after function definition on line 9
11 
12 
13 
14 # 1.标点符号错误:如果你在代码中遗漏了逗号、冒号、引号等标点符号,也会导致SyntaxError异常
15 my_list = [1, 2, 3
16 print(my_list)  # 这里将会引发SyntaxError异常,SyntaxError: '[' was never closed

语法错误,pycharm会把你标识出来

 1.9 TypeError

'''
TypeError是Python中的一个内置异常类,它表示在使用了错误的数据类型或参数类型时发生了错误。
当你尝试对不兼容的对象执行操作或传递错误类型的参数时,就会引发TypeError异常
'''

# 1. 不兼容的操作:当你对不支持的数据类型执行操作时,例如将字符串与数字相加,会引发TypeError异常
x = "Hello"
y = 5


# result = x + y  # 字符串与整型做+操作,会导致类型不兼容即这里将会引发TypeError异常  TypeError: can only concatenate str (not "int") to str

# 坑1. 错误的参数类型:当你向函数传递错误类型的参数时,也会引发TypeError异常。
def multiply(a, b):
    return a * b


result = multiply("2", 3)  # 这里不会引发TypeError异常,因为字符串支持 str * n作为乘积即字符串变成n个str
print(result)  # 222

1.10 ValueError

'''
ValueError是Python中的一个内置异常类,它表示在使用了正确类型的对象但是值不合法时发生了错误。
当你尝试对一个对象进行操作或传递给函数时,其值不符合预期范围或无效时,就会引发ValueError异常。
'''

# 1. 类型转换错误:当你尝试将一个无法转换为目标类型的对象转换为该类型时,会引发ValueError异常。
int_value = int("abc")  # 这里将会引发ValueError异常 ValueError: invalid literal for int() with base 10: 'abc'

# 2. 参数值无效:当你向函数传递了一个值,而该值无效或不在允许的范围内时,会引发ValueError异常
import math

sqrt_result = math.sqrt(-1)  # 这里将会引发ValueError异常  ValueError: math domain error

# 3. 其他特定函数的异常:某些特定的函数也可能引发ValueError异常,以表明输入值不合法。
# 例如,enumerate()函数中的start参数必须是整数,如果不满足要求,则会引发ValueError异常。
for i, item in enumerate(["a", "b", "c"], start="1"):  # 这里将会引发ValueError异常 TypeError: 'str' object cannot be interpreted as an integer
    print(i, item)

 

posted @ 2023-07-22 10:08  Allen_Hao  阅读(112)  评论(0)    收藏  举报