Python基础——异常

目录

1. 异常的分类

2. 常见的异常类型

3. 异常的捕获与处理

4. 多个异常的处理

5. 捕获所有异常

6. else 和 finally 块

7. 自定义异常

8. 抛出异常


在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,还有一类错误是完全无法在程序运行过程中预测的,调试时我们关心这些错误是什么类型的错误,在哪儿出错的,以及为什么出错。

在 Python 中,异常(Exception)是用于处理程序运行时错误的一种机制。当程序遇到错误时,它不会简单地崩溃,而是抛出一个异常对象,这允许开发者捕获并处理这些错误,从而使得程序可以处理意外情况或错误输入。

1. 异常的分类

Python 中的异常分为两大类:

  • 语法错误(SyntaxError):通常出现在代码的语法不正确时,导致代码无法执行。
  • 运行时错误(RuntimeError):在程序运行过程中发生的错误,程序可以被捕获并处理。

2. 常见的异常类型

  • SyntaxError:语法错误。
  • IndexError:访问不存在的列表索引时抛出。
  • KeyError:访问不存在的字典键时抛出。
  • ValueError:传递给函数的值不合适时抛出。
  • TypeError:发生类型不匹配时抛出。
  • NameError:访问不存在的变量名时抛出。
  • ZeroDivisionError:除以零时抛出。
  • FileNotFoundError:文件操作失败时抛出。
  • AttributeError:访问不存在的对象属性时抛出。

3. 异常的捕获与处理

Python 提供了 tryexcept 语句来捕获和处理异常。代码块中可能会引发异常的部分放在 try 语句中,异常类型放在 except 语句中。

try:
    # 可能引发异常的代码
    x = 1 / 0  # 这里会引发 ZeroDivisionError
except ZeroDivisionError as e:
    # 捕获到 ZeroDivisionError
    print("除以零错误:", e)

4. 多个异常的处理

可以使用多个 except 子句来处理不同类型的异常,或者使用一个 except 来捕获多个异常类型。

try:
    # 可能引发多个不同类型异常的代码
    num = int(input("请输入一个数字: "))  # 可能抛出 ValueError
    result = 10 / num  # 可能抛出 ZeroDivisionError
except ValueError as e:
    print("输入无效,必须输入数字!")
except ZeroDivisionError as e:
    print("不能除以零!")

也可以用一个 except 来捕获多个异常类型:

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
except (ValueError, ZeroDivisionError) as e:
    print("出现错误:", e)

5. 捕获所有异常

如果希望捕获所有异常类型,可以使用 except 后不指定异常类型,或指定为 Exception 类。但这并不推荐,因为捕获所有异常可能会掩盖程序中的其他问题。

try:
    x = 10 / 0
except Exception as e:
    print("发生了一个错误:", e)

6. else 和 finally 块

除了 try except,Python 还支持 else finally 块。

  • else 块:如果 try 块没有抛出异常,else 块中的代码会被执行。
  • finally 块:无论是否抛出异常,finally 块中的代码都会被执行(例如关闭文件、释放资源等)。
try:
    x = 10 / 2
except ZeroDivisionError as e:
    print("除以零错误:", e)
else:
    print("没有异常发生,结果是", x)
finally:
    print("无论如何都执行的代码")

7. 自定义异常

Python 允许开发者自定义异常类型。可以通过继承 Exception 类或者其子类来定义自己的异常。

class MyError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

try:
    raise MyError("这是一个自定义异常")
except MyError as e:
    print(f"捕获到自定义异常: {e}")

8. 抛出异常

如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出,使用 raise 关键字主动抛出异常。在特定条件下触发错误,或者在处理某些特殊逻辑时非常有用。

def check_age(age):
    if age < 18:
        raise ValueError("年龄不能小于18岁")
    else:
        print("年龄符合要求")

try:
    check_age(16)
except ValueError as e:
    print("错误:", e)
本文是转载文章,点击查看原文
如有侵权,请联系 lx@jishuguiji.net 删除。