异常机制

1. 常见异常类型

Python 内置了许多异常类型,以下是一些常见的异常:

  • SyntaxError: 语法错误,代码不符合 Python 语法规则。
  • IndentationError: 缩进错误,通常是由于缩进不一致引起的。
  • NameError: 尝试访问未定义的变量或函数。
  • TypeError: 操作或函数应用于不适当类型的对象。
  • ValueError: 函数接收到正确类型但值不合适的参数。
  • IndexError: 尝试访问序列中不存在的索引。
  • KeyError: 尝试访问字典中不存在的键。
  • FileNotFoundError: 尝试打开不存在的文件。
  • ZeroDivisionError: 除数为零的错误。
  • AttributeError: 尝试访问对象不存在的属性。

2. 异常处理

Python 使用 tryexceptelsefinally 语句来处理异常。

基本语法

try:
    # 可能引发异常的代码
except xxError1:
    # 处理特定异常
except xxError2:
    # 处理特定异常
except Exception as e:  # 这是最大的异常
    # 兜底的异常
    print(e)  # 输出异常,不会有类型,只有描述
else:
    # 如果没有异常发生,执行此块
finally:
    # 无论是否发生异常,都会执行此块

示例

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
    print(f"结果: {result}")
except ValueError:
    print("不是数字")
except ZeroDivisionError:
    print("不能输入0")
except Exception as e:
  	print("未知的异常")
    print(e)
else:
    print("计算正常结束")
finally:
    print("程序完成")

3. 抛出异常

使用 raise 语句可以主动抛出异常

def check_age(age):
    if age < 0:
        raise ValueError("不能是负数")
    elif age < 18:
        print("未成年")
    else:
        print("已成年")
        
check_age(-5)  # 报错

4. 自定义异常

通过继承 Exception 类来创建自定义异常。

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

try:
    raise CustomError("This is a custom error!")
except CustomError as e:
    print(f"Caught an exception: {e}")

5. traceback 库

如果使用 try except 捕获了异常,在打印异常时只能输出描述,而不是完整的堆栈信息,这时可以使用 traceback 库中的方法

try:
    1 / 0
except Exception as e:
    print(e)  # 输出 division by zero

如果使用 traceback

import traceback

try:
    1 / 0
except Exception:
    traceback.print_exc()  # 会输出详细信息

try:
    1 / 0
except Exception:
		error_message = traceback.format_exc()  # 格式化堆栈信息为字符串,比如需要把错误信息记录日志就需要写入文本数据
    print("Error details:\n", error_message)  # 输出以字符串表述的异常信息
    
# 还有一些别的方法就不列举了

5. 总结

  • try: 包含可能引发异常的代码。
  • except: 捕获并处理异常。
  • else: 当没有异常发生时执行。
  • finally: 无论是否发生异常都会执行。
  • raise: 主动抛出异常。
  • 自定义异常: 通过继承 Exception 类创建。
posted @ 2025-03-12 13:13  CyrusHuang  阅读(33)  评论(0)    收藏  举报