logo

该视频仅会员有权观看

立即开通课程「Python 入门」权限。

¥
199
/ 年

异常处理

异常处理是指在程序运行过程中处理错误或异常的机制。异常处理使程序能够优雅地应对运行时错误,避免程序崩溃。想象你正在做一顿晚餐,在烹饪过程中可能会遇到各种意外情况:

  • 火太大,食物烧焦了
  • 忘记买某种配料
  • 切菜时不小心割伤了手指

这些就像程序中的"异常",异常处理就是你对这些意外情况的应对方法:

  • 如果食物烧焦,你可能会重新开始
  • 如果缺少配料,你可能会改变菜谱或去买配料
  • 如果割伤手指,你会停下来处理伤口

在 Python 中,使用 tryexceptelsefinally 关键字进行异常处理,基本结构如下所示:

try: # 尝试执行可能出错的代码 except SomeException: # 如果发生特定类型的错误,执行这里的代码 except AnotherException: # 处理另一种类型的错误 else: # 如果没有发生异常,执行这里的代码 finally: # 无论是否发生异常,都会执行这里的代码

其中的 try 块中是可能引发异常的代码,except 块捕获并处理特定类型的错误,else 块在没有发生错误时执行,finally 块无论是否发生错误都会执行。

这样的结构让程序能够优雅地处理各种可能的错误情况,而不是直接崩溃。比如现在我们来看一个简单的例子,用户输入一个数字,然后计算 10 除以这个数字:

num = int(input("请输入一个数字: ")) result = 10 / num print("计算结果是: ", result)

上面这段代码中,我们直接将用户输入的数字作为除数进行计算,但是有可能用户输入的并不是一个合法的数字,比如输入的是字符串,这时就会引发异常,导致程序崩溃。

请输入一个数字: abc Traceback (most recent call last): File "/Users/cnych/Movies/pybase/lesson13/exception.py", line 1, in <module> num = int(input("请输入一个数字: ")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: 'abc'

同样的,如果用户输入的是数字 0,那么同样会引发异常,因为 0 不能作为除数。

请输入一个数字: 0 Traceback (most recent call last): File "/Users/cnych/Movies/pybase/lesson13/exception.py", line 2, in <module> result = 10 / num ~~~^~~~~ ZeroDivisionError: division by zero

为了能够避免这些异常,我们可以使用异常处理来优雅地处理这些错误情况,如下所示:

try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except ValueError: # 处理输入的不是数字的情况 print("请输入一个有效的数字") except ZeroDivisionError: # 处理除以 0 的情况 print("不能除以零") else: print("没有发生错误") finally: print("程序结束")

现在如果我们输入的是一个字符串,程序会输出 "请输入一个有效的数字",如果输入的是 0,程序会输出 "不能除以零",如果输入的是一个合法的数字,程序会输出计算结果,并且输出 "没有发生错误" 和 "程序结束"。

except 可以捕获多种异常,通过列出异常类型来处理不同的错误,上面的代码中我们分别处理了 ValueErrorZeroDivisionError 两种异常,除了直接指定异常类型外,还可以使用 except Exception as e 来捕获所有异常,然后通过 e 变量来获取异常信息。

try: value = int(input("输入一个数字: ")) result = 100 / value except (ValueError, ZeroDivisionError) as e: print(f"发生错误: {e}")

这里我们同时捕获 ValueErrorZeroDivisionError 两个异常,并输出错误信息。

如果不能确定会发生什么异常,可以使用 Exception 来捕获所有异常,Exception 异常是所有异常的基类,可以捕获所有异常。

try: value = int(input("输入一个数字: ")) result = 100 / value except Exception as e: print(f"发生错误: {e}")

还有的时候我们可以主动抛出异常,这就需要使用到 raise 关键字,比如下面这个例子:

def check_value(x): if x < 0: raise ValueError("值不能为负数") # 主动抛出 ValueError 异常 try: check_value(-5) except ValueError: # 捕获 ValueError 异常 print("捕获到值错误,重新引发...") raise # 重新引发异常,可用于日志记录或上层处理

上面的代码中我们在 check_value 函数中定义了如果 x 小于 0 了就会主动抛出一个 ValueError 异常,然后我们需要做的就是在调用这个函数的地方捕获这个异常即可,如果我们想要在捕获到这个异常后重新引发这个异常,还可以在最后加上 raise 关键字,这样可用于日志记录或上层处理。

此外我还可以自定义异常,用于处理特定场景下的错误。我们只需要定义一个继承自 Exception 的类即可,比如下面这个例子:

# 自定义异常 class CustomError(Exception): # 继承自 Exception pass def check_value(x): if x < 0: raise CustomError("值不能为负数") try: check_value(-1) except CustomError as e: print(e)

上面代码中我们定义了一个 CustomError 异常类,只需要继承自 Exception 即可,然后在 check_value 函数中如果 x 小于 0 了就会抛出这个自定义异常,然后我们在调用这个函数的地方捕获这个异常即可。

这里我们使用到了 class 类的概念,这个会在后面的章节中详细讲解。

异常处理是编程中非常重要的一部分,可以帮助我们优雅地处理各种错误情况,避免程序崩溃,提高代码的健壮性和可维护性,希望大家能够通过这些例子,更好的理解异常处理的概念和用法。