案例1:try-except - ValueError
w = "我叫陈浩,毕业于谢菲尔德大学"
try:
w4 = w.index("陈浩是最好的学生" )
print(w4) # 输出结果:ValueError: substring not found,因为这里报错了,所以原字符串里面并没有这个字符串“陈浩是最好的学生”
except ValueError:
print("ValueError: substring not found")
案例2:try-except - indexError
a = ["昨天","今天","后天",1,2,3,4,5,6,True,["这是另一个列表哦",1,2,3,4,5,6]]
try:
print(a[100]) # 输出结果:IndexError: list index out of range
except IndexError:
print("IndexError: list index out of range")
1. ValueError
和 IndexError
的区别
(1)ValueError
ValueError
是当函数或操作接收到正确类型但值不合适的参数时引发的异常。在字符串的 index()
方法中,如果子字符串不存在于主字符串中,就会引发 ValueError
。
示例:
w = "我叫陈浩,毕业于谢菲尔德大学"
try:
w4 = w.index("陈浩是最好的学生")
except ValueError:
print("ValueError: substring not found")
w.index("陈浩是最好的学生")
尝试找到子字符串 "陈浩是最好的学生"
在字符串 w
中的位置。
如果子字符串不存在,index()
方法会引发 ValueError
,因为它的值(子字符串)不合适。
(2)IndexError
IndexError
是当尝试访问序列(如列表、元组、字符串等)中不存在的索引时引发的异常。
示例:
a = ["昨天", "今天", "后天", 1, 2, 3, 4, 5, 6, True, ["这是另一个列表哦", 1, 2, 3, 4, 5, 6]]
try:
print(a[100]) # 尝试访问索引 100,但列表中只有索引 0 到 10
except IndexError:
print("IndexError: list index out of range")
a[100]
尝试访问列表 a
中索引为 100 的元素。
由于列表的长度为 11(索引范围是 0 到 10),索引 100 超出了范围,因此会引发 IndexError
。
2. 为什么第一个地方用 except
ValueError
,第二个地方用 except
IndexError
(1)w.index()
的行为
w.index()
是字符串的方法,用于查找子字符串在主字符串中的位置。
如果子字符串不存在,会引发 ValueError
,因为这是值不合适的情况。
(2)a[100]
的行为
a[100]
是尝试访问列表 a
的索引为 100 的元素。
如果索引超出范围,会引发 IndexError
,因为这是索引不存在的情况。
小结:
ValueError
:用于处理值不合适的情况,例如子字符串不存在。
IndexError
:用于处理索引超出范围的情况,例如访问不存在的索引。
详细介绍:
(1)ValueError
ValueError
是当函数或操作接收到了正确类型,但值不合适的参数时引发的异常。它通常与函数的预期行为有关,而不是索引问题。
常见场景:
字符串的 index()
方法:如果子字符串不存在,会引发 ValueError
。
int()
或 float()
转换:如果传入的字符串不能被转换为数字,会引发 ValueError
。
列表的 remove()
方法:如果要删除的元素不存在于列表中,会引发 ValueError
。
解释:案例1
w.index()
方法的目的是查找子字符串在主字符串中的位置。
如果子字符串不存在,函数无法完成预期的任务(查找子字符串的位置),因此抛出 ValueError
。
(2)IndexError
IndexError
是当尝试访问序列(如列表、元组、字符串等)中不存在的索引时引发的异常。它与索引的合法性有关,而不是值的内容。
常见场景:
访问列表或元组中不存在的索引。
使用切片时,索引超出范围。
解释:案例2
列表 a
的最大索引是 10(因为有 11 个元素,索引范围是 0 到 10)。
尝试访问索引 100 时,超出了列表的范围,因此抛出 IndexError
。
核心区别
(1)触发条件
ValueError
:
与值的内容有关。
函数或操作接收到了正确的类型,但值不符合预期。
例如,子字符串不存在于主字符串中。
IndexError
:
与索引的合法性有关。
尝试访问序列中不存在的索引。
例如,索引超出范围。
(2)语义
ValueError
:
表示“值不合适”或“值不存在”。
通常与函数的预期行为有关。
IndexError
:
表示“索引超出范围”。
通常与序列的边界有关。
总结
ValueError
:
与值的内容有关。
函数或操作接收到了正确的类型,但值不符合预期。
例如,子字符串不存在于主字符串中,或尝试将非数字字符串转换为数字。
IndexError
:
与索引的合法性有关。
尝试访问序列中不存在的索引。
例如,索引超出范围。
关键区别:
ValueError
是“值不合适”的问题。
IndexError
是“索引超出范围”的问题。