try-except 中except IndexError与 ValueError的区别

案例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是“索引超出范围”的问题。

你可能感兴趣的:(python)