跳转至

异常处理

捕获并处理异常

try-except 语句

使用 try-except 来捕获并处理异常,如果 try 没有检查到异常就不会执行异常处理代码,捕获的异常并不是字符串而是异常类。

语法:

Python
1
2
3
4
try:
  # 需要运行的代码
except:
  # 异常处理代码
Python
# 使用
try:
  1 / 0
except:
  print("!!!!")

# 在except指定具体的异常,只有捕获到这个异常才会执行异常处理代码
try:
  1 / 0
except ZeroDivisionError:
  print("!!!!")

# 在except后面添加as将异常内容提取出来
try:
  1 / 0
except ZeroDivisionError as err:
  print("!!!!")
  print(err)

# 在except后面使用元组添加多个异常类型
try:
  1 / 0
  1 + '1'
except (ZeroDivisionError, ValueError, TypeError) as err:
  print("!!!!")
  print(err)

# 单独处理不同异常使用多个except实现,捕获到异常后面代码就不会继续执行
try:
  1 / 0
  1 + '1'
except ZeroDivisionError as err:
  print("ZeroDivisionError")
  print(err)
except ValueError as err:
  print("ValueError")
  print(err)
except TypeError as err:
  print("TypeError")
  print(err)

1.1.2 try-except-else

当 try 语句没有检测出异常的情况下,执行 else 语句内容,检测出异常执行 except 内容。

Python
1
2
3
4
5
6
try:
  1 / 0
except:
  print("!!!")
else:
  print("未发生错误")

try-except-finally 语句

无论异常是否发生都必须执行 finally 内容,通常用于执行收尾工作的内容,在函数中,即使在 try 中有 return 语句,最后也会执行 finally 内容。

Python
1
2
3
4
5
6
7
try:
  f = open("1.txt", "w")
  f.write("1111")
except:
  print("!!!!")
finally:
  f.close()

try-finally 语句

等待 try 执行完成或者报错然后执行 finally 内容。

Python
1
2
3
4
5
6
7
try:
  while True:
    pass
  finally:
    print("ok")

# 此时需要强制结束程序才可以退出,强制结束会先打印ok

异常处理基本语法

Python
try:
    # 检测范围
except [expression [as identifier]]:
    # 异常处理代码
[except [expression [as identifier]]:
    # 异常处理代码]*
[else:
    # 没有触发异常执行的代码]
[finally:
    # 收尾工作执行的代码]


try:
    # 检测范围
finally:
    # 收尾工作执行的代码

异常处理嵌套语法

Python
try:
    try:
        fin
    except:
        print("内部错误")
    1 / 0
except:
    print("外部错误")
finally:
    print("收尾工作")

raise 语句

主动引发异常,注意不可以使用 raise 声明一个不存在的异常。

Python
1
2
3
raise ValueError("值不正确")
# raise 可以不添加任何错误类型直接使用
# 不添加错误类型会引发RuntimeError异常

raise 语句可以更改异常类型。

Python
1
2
3
4
try:
    1 / 0
except:
    raise ValueError("!!!!")

raise 异常链。

Python
raise ValueError("值不正确") from ZeroDivisionError

assert 语句

主动引发异常,不过 assert 只可以引发 AssertionError 的异常,语句存在的意义通常用于代码调试,如果程序的判断不存在立马抛出异常。

Python
1
2
3
f = "a"
assert if f == "a"  # 如果条件成立程序正常执行
assert if f == "b"  # 如果条件不成立就会引发一个AssertionError异常

利用异常来实现 goto

Python 没有 goto 语句,不想其他语言使用 goto 语句可以直接跳转至指定代码,可以使用异常来实现 goto。

Python
1
2
3
4
5
6
7
8
9
try:
    while True:
        while True:
            for i in range(10):
                if i > 3:
                    raise
                print(i)
except:
    print("程序到这里了")

代码示例

Python
# 请编写代码,实现在捕获异常之后,打印一句 “出错啦”,再重新抛出相对应的异常(注意,这里我们说的异常并不特指具体的哪一类,而是泛指所有的异常
try:
    1 / 0
except:
    print("出错啦~")
    raise

# Exception 所有异常类都是从它继承,可以将它代替为止的异常
try:
    1 / 0
except Exception as err:
    print("出错啦~")
    print(err)