温馨提示×

Ubuntu Python异常怎么处理

小樊
37
2025-11-28 19:58:37
栏目: 编程语言

Ubuntu 下 Python 异常处理与排查指南

一 基本语法与执行方式

  • 使用 try/except/else/finally 捕获与处理异常,避免程序崩溃,并在必要时做资源清理。
  • Ubuntu 终端运行脚本使用命令:python3 your_script.py

示例

try:
    x = int(input("请输入整数: "))
    result = 10 / x
except ValueError:
    print("输入不是整数")
except ZeroDivisionError:
    print("除数不能为 0")
else:
    print(f"结果是: {result}")
finally:
    print("处理结束")

要点

  • 尽量捕获具体异常类型(如 ValueErrorZeroDivisionError),避免裸写 except:
  • else 仅在无异常时执行;finally 无论是否异常都会执行,适合做清理工作。

二 常见场景与处理建议

  • 文件操作:可能遇到 FileNotFoundErrorPermissionError 等,建议用上下文管理器 with 自动关闭文件,并分别捕获对应异常给出明确提示。
  • 用户输入与类型转换:使用 int()/float() 时捕获 ValueError,提示输入格式。
  • 网络请求:使用 requests 时区分 HTTPErrorConnectionErrorTimeout 等,必要时调用 response.raise_for_status() 触发 HTTP 状态异常。
  • 多异常合并:对可统一处理的异常使用元组,如 except (ZeroDivisionError, TypeError):
  • 调试与日志:使用 pdb 设置断点定位问题;使用 logging 记录错误上下文,便于线上排查。

示例 文件与网络

# 文件
import logging
logging.basicConfig(level=logging.ERROR)

try:
    with open("data.txt", "r") as f:
        content = f.read()
except FileNotFoundError:
    logging.error("文件未找到")
except PermissionError:
    logging.error("无权限读取文件")

# 网络
import requests
try:
    r = requests.get("https://example.com", timeout=5)
    r.raise_for_status()
except requests.exceptions.HTTPError as e:
    logging.error(f"HTTP 错误: {e}")
except requests.exceptions.ConnectionError:
    logging.error("连接失败")
except requests.exceptions.Timeout:
    logging.error("请求超时")
except requests.exceptions.RequestException as e:
    logging.error(f"请求异常: {e}")

要点

  • 文件优先用 with;网络请求按异常类型分别处理,最后兜底 RequestException

三 调试与日志记录

  • 日志记录:配置 logging(如 basicConfig(level=logging.ERROR)),在 except 中记录错误并附带上下文信息,避免仅打印堆栈。
  • 交互式调试:在可疑位置插入 pdb.set_trace() 暂停执行,检查变量与调用栈,快速定位根因。
  • 重新抛出异常:处理完必要逻辑后使用 raise 继续向上抛出,避免掩盖错误源。

示例

import logging, pdb

logging.basicConfig(level=logging.ERROR)

def compute(a, b):
    try:
        return a / b
    except ZeroDivisionError as e:
        logging.error("计算失败: 除数不能为 0 (a=%s, b=%s)", a, b)
        raise  # 继续向上抛出

# 需要时断点调试
# pdb.set_trace()

要点

  • 记录要包含关键变量与业务语义;必要时再抛出,保障调用链可感知错误。

四 自定义异常与最佳实践

  • 自定义异常:继承 Exception,为不同业务错误定义语义清晰的异常类,便于调用方精准捕获与处理。
  • 精准捕获:优先捕获具体异常,慎用 except Exception;对可合并处理的异常使用元组。
  • 资源清理:使用 finallywith 确保文件、网络连接等资源被释放。
  • 提供上下文:在异常消息中包含输入、状态或关键变量,提升可维护性。
  • 分层处理:底层库抛业务异常,上层服务统一映射为用户友好提示或错误码。

示例 自定义异常

class NegativeValueError(Exception):
    """值不能为负数"""
    def __init__(self, value):
        super().__init__(f"值不能为负数: {value}")
        self.value = value

def check_value(v):
    if v < 0:
        raise NegativeValueError(v)

try:
    check_value(-1)
except NegativeValueError as e:
    print(e)

要点

  • 自定义异常让错误语义更清晰;配合分层处理提升系统可观测性与可维护性。

0