Python案例怎么捕获程序异常?

wen python案例 13

本文目录导读:

Python案例怎么捕获程序异常?

  1. 基础异常捕获
  2. 捕获多个异常
  3. 使用else和finally
  4. 自定义异常
  5. 实际应用案例 - 处理网络请求
  6. 断言异常处理
  7. 嵌套异常处理
  8. 最佳实践建议

在Python中捕获程序异常主要使用try-except语句,以下是一些常见的异常捕获案例:

基础异常捕获

try:
    # 可能出错的代码
    num = int(input("请输入一个数字: "))
    result = 10 / num
    print(f"结果是: {result}")
except ZeroDivisionError:
    print("错误:不能除以0!")
except ValueError:
    print("错误:请输入有效的数字!")
except Exception as e:
    print(f"其他错误: {e}")

捕获多个异常

try:
    data = [1, 2, 3]
    index = int(input("请输入索引: "))
    print(data[index])
except (IndexError, ValueError) as e:
    print(f"索引或输入错误: {e}")

使用else和finally

try:
    file = open("test.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件不存在")
else:
    # 没有异常时执行
    print("文件读取成功")
    print(content)
finally:
    # 无论是否有异常都执行
    print("清理资源")
    if 'file' in locals():
        file.close()

自定义异常

class AgeError(Exception):
    """自定义年龄异常"""
    def __init__(self, age, message="年龄必须大于0"):
        self.age = age
        self.message = message
        super().__init__(self.message)
def check_age(age):
    if age < 0:
        raise AgeError(age)
    elif age > 150:
        raise AgeError(age, "年龄不能超过150岁")
    return f"年龄: {age}"
try:
    result = check_age(-5)
    print(result)
except AgeError as e:
    print(f"异常: {e.message}, 年龄: {e.age}")

实际应用案例 - 处理网络请求

import requests
from requests.exceptions import RequestException, Timeout
def fetch_data(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()  # 检查HTTP状态码
        return response.json()
    except Timeout:
        print("请求超时")
        return None
    except RequestException as e:
        print(f"请求失败: {e}")
        return None
    except ValueError as e:
        print(f"JSON解析失败: {e}")
        return None
# 使用示例
try:
    data = fetch_data("https://api.example.com/data")
    if data:
        print("数据获取成功")
except Exception as e:
    print(f"未知错误: {e}")

断言异常处理

def divide(a, b):
    assert b != 0, "除数不能为0"
    return a / b
try:
    result = divide(10, 0)
except AssertionError as e:
    print(f"断言错误: {e}")

嵌套异常处理

try:
    try:
        num = int(input("请输入数字: "))
        result = 100 / num
    except ValueError:
        print("输入不是有效数字")
        raise  # 重新抛出异常
    except ZeroDivisionError:
        print("不能除以0")
        raise
except Exception as e:
    print(f"外部捕获到异常: {e}")

最佳实践建议

  1. 尽量捕获具体异常,避免使用裸except:
  2. 不要忽略异常,至少记录日志
  3. 在合适的位置捕获,不要包装所有代码
  4. 使用finally清理资源,如关闭文件、数据库连接
# 推荐的做法
try:
    with open("file.txt", "r") as f:
        content = f.read()
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("没有读取权限")
finally:
    # 使用with语句自动管理资源,不需要手动关闭
    pass

掌握这些异常处理技巧,可以让你的Python程序更加健壮和可靠。

抱歉,评论功能暂时关闭!