本文全面讲解Python中的错误和异常处理机制,从基础概念到高级用法,帮你构建健壮的Python程序。1. 为什么需要异常处理?在编程中,错误是不可避免的。想象一下:你写了一个读取文件的程序,但文件不存在;或者计算用户输入的数据,但用户输入了字母而不是数字。没有异常处理,程序会直接崩溃,给用户带来糟糕的体验。异常处理的好处:提高程序的稳定性和健壮性提供有意义的错误信息允许程序优雅地恢复或退出便于调试和维护2. Python错误类型全解析2.1 语法错误(SyntaxError)语法错误是程序在运行前就被Python解释器发现的错误,程序无法执行。# 示例1:缺少冒号 if True print("Hello") # ❌ SyntaxError: expected ':' # 示例2:括号不匹配 print("Hello" # ❌ SyntaxError: unexpected EOF while parsing # 示例3:错误的关键字 whle True: # ❌ SyntaxError: invalid syntax pass如何解决:仔细检查错误提示的行使用IDE(如PyCharm、VSCode)的语法高亮功能注意缩进、括号、冒号等细节2.2 运行时错误(异常)运行时错误发生在程序执行期间,Python用异常来表示这类错误。# 示例1:除零错误 result = 10 / 0 # ❌ ZeroDivisionError: division by zero # 示例2:名称错误 print(undefined_variable) # ❌ NameError: name 'undefined_variable' is not defined # 示例3:类型错误 "2" + 2 # ❌ TypeError: can only concatenate str (not "int") to str3. Python异常类层次结构了解异常类的继承关系有助于更好地处理异常:BaseException ├── SystemExit ├── KeyboardInterrupt ├── GeneratorExit └── Exception ├── ArithmeticError │ ├── ZeroDivisionError │ ├── FloatingPointError │ └── OverflowError ├── LookupError │ ├── IndexError │ └── KeyError ├── OSError │ ├── FileNotFoundError │ ├── PermissionError │ └── TimeoutError ├── TypeError ├── ValueError ├── AttributeError ├── NameError └── 更多...4. 基础异常处理:try...except4.1 基本语法try: # 可能引发异常的代码 result = 10 / 0 except ZeroDivisionError: # 处理特定异常 print("错误:不能除以零!")4.2 多种异常处理# 方法1:多个except块 try: num = int(input("请输入一个数字: ")) result = 100 / num print(f"100 / {num} = {result}") except ValueError: print("错误:请输入有效的数字!") except ZeroDivisionError: print("错误:不能除以零!") except Exception as e: # 捕获所有其他异常 print(f"发生了未知错误: {type(e).__name__}: {e}") # 方法2:一个except块处理多个异常 try: # 可能引发多种异常的代码 data = {"name": "Alice"} print(data["age"]) # 可能引发KeyError num = int("abc") # 可能引发ValueError except (KeyError, ValueError) as e: print(f"数据错误: {e}") # 方法3:分别处理但共享部分代码 try: file = open("不存在的文件.txt", "r") content = file.read() except FileNotFoundError as e: print(f"文件未找到: {e}") # 记录日志或执行其他操作 except IOError as e: print(f"IO错误: {e}") # 记录日志或执行其他操作5. 完整的异常处理结构def divide_numbers(): """一个完整的异常处理示例""" try: # 1. 可能引发异常的代码 numerator = float(input("请输入被除数: ")) denominator = float(input("请输入除数: ")) result = numerator / denominator except ValueError as e: # 2. 处理值错误(输入不是数字) print(f"输入错误: 请输入有效的数字!详细信息: {e}") return None except ZeroDivisionError as e: # 3. 处理除零错误 print("数学错误: 除数不能为零!") return None except Exception as e: # 4. 处理其他所有异常 print(f"发生了意外错误: {type(e).__name__}: {e}") return None else: # 5. 如果没有异常发生,执行这里的代码 print(f"计算成功!{numerator} ÷ {denominator} = {result}") return result finally: # 6. 无论是否发生异常,都会执行的代码 print("=" * 40) print("计算过程结束,感谢使用!") print("=" * 40) # 测试各种情况 if __name__ == "__main__": # 测试正常情况 print("测试1: 正常计算") divide_numbers() # 输入: 10, 2 print("\n测试2: 除零错误") divide_numbers() # 输入: 10, 0 print("\n测试3: 输入错误") divide_numbers() # 输入: abc, 26. 抛出异常:raise语句有时我们需要主动引发异常:6.1 基本用法def process_age(age): """处理年龄,验证合理性""" if not isinstance(age, (int, float)): raise TypeError("年龄必须是数字") if age 0: raise ValueError("年龄不能为负数") if age 150: raise ValueError("年龄超过合理范围") if age = 18: return "成年人" else: return "未成年