Featured image of post Python Basic 12 常用错误处理

Python Basic 12 常用错误处理

本篇文章主要介绍Python的常用错误处理

为什么需要错误处理?

在代码运行中难免会出现各种"翻车现场"🚗💥:

  • 用户输入了奇怪的东西
  • 文件找不到了
  • 网络连接断了
  • 计算过程出错了…

如果不处理这些错误,程序就会直接崩溃(╥﹏╥) 而好的错误处理能让程序优雅地应对意外~

基本错误处理 - try/except

最基本的错误处理结构长这样:

1
2
3
4
5
6
try:
    # 尝试运行的代码
    risky_operation()
except ErrorType:
    # 出错时执行的代码
    handle_error()

举个栗子 🌰

1
2
3
4
5
try:
    age = int(input("请输入您的年龄:"))
    print(f"您明年就{age + 1}岁啦!")
except ValueError:
    print("喂喂,年龄要输入数字啊!(╯°□°)╯︵ ┻━┻")

输出:

1
2
请输入您的年龄:abc
喂喂,年龄要输入数字啊!(╯°□°)╯︵ ┻━┻

常见错误类型一览表 📋

错误类型 什么时候出现 举个栗子
SyntaxError 语法错误 print("hello" 少括号
IndentationError 缩进错误 该缩进没缩进
NameError 访问未定义变量 print(never_defined_var)
TypeError 类型操作不当 "1" + 2
ValueError 值不合法 int("abc")
IndexError 索引越界 [1,2][99]
KeyError 字典键不存在 {"a":1}["b"]
AttributeError 访问不存在的属性 "str".unknown_method()
ZeroDivisionError 除数为零 1/0
FileNotFoundError 文件找不到 open("ghost.txt")

多重错误处理

可以捕获多种不同类型的错误:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
try:
    # 危险操作区 😈
    result = 10 / int(input("输入一个除数: "))
    print("结果是:", result)
except ValueError:
    print("输入必须是一个数字啦!(╬ Ò﹏Ó)")
except ZeroDivisionError:
    print("不能除以0啊兄弟!(ノ`Д´)ノ")
except Exception as e:
    print("发生了未知错误:", str(e))

完整的try-except-else-finally结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
try:
    print("尝试打开文件...")
    file = open("data.txt", "r")
except FileNotFoundError:
    print("文件找不到了!Σ(°△°|||)︴")
else:
    print("文件读取成功!内容如下:")
    print(file.read())
    file.close()
finally:
    print("无论如何我都会被执行~( ̄▽ ̄)~*")

主动抛出异常 - raise

我们也可以主动制造错误:

1
2
3
4
5
6
7
8
9
def register(username):
    if len(username) < 3:
        raise ValueError("用户名太短啦!至少3个字符 (>﹏<)")
    # 其他注册逻辑...
  
try:
    register("ab")
except ValueError as e:
    print("注册失败:", str(e))

自定义异常类

觉得内置错误不够用?可以自己造:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class TooLazyError(Exception):
    """当程序员太懒时抛出"""
    def __init__(self, laziness_level):
        self.laziness_level = laziness_level
        super().__init__(f"懒惰等级{laziness_level}超标了!需要咖啡续命☕")

try:
    raise TooLazyError(99)
except TooLazyError as e:
    print(f"错误:{e}")  # 错误:懒惰等级99超标了!需要咖啡续命☕

实际应用小贴士 💡

  1. 不要过度捕获:只捕获你预期会发生的错误

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # 不好 👎
    try:
        do_something()
    except:
        pass  # 这样会隐藏所有错误!
    
    # 好的 👍
    try:
        do_something()
    except ExpectedError:
        handle_error()
    
  2. 日志记录很重要:使用logging模块记录错误

  3. 提供有用的错误信息:帮助用户理解问题

  4. finally很强大:适合做清理工作(如关闭文件)

9. 高阶技巧:上下文管理器(with语句)

超级好用的错误预防工具!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 传统方式
try:
    file = open("data.txt", "r")
    content = file.read()
finally:
    file.close()

# 优雅方式
with open("data.txt", "r") as file:
    content = file.read()
# 文件会自动关闭,即使发生错误也不会泄露

总结 ✨

  • 使用try/except来保护可能出错的代码
  • 明确定义你期望处理的错误类型
  • 不要吞掉所有错误(这会隐藏bug)
  • 合理使用elsefinally
  • 必要时自定义异常类
  • with语句是你的好朋友

记得:好的错误处理不是为了消灭所有错误,而是为了让程序在出错时能体面地应对!٩(◕‿◕。)۶

有问题欢迎随时问我哦~ (ノ^_^)ノ

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计