当前位置:首页 > 技术 > 正文内容

异常处理与断言机制

访客 技术 2026年9月24日 12

异常处理是编程中非常重要的一个环节,用于捕获和处理程序运行过程中可能发生的错误。下面将详细介绍异常的定义、分类以及处理方法。

什么是异常

异常是指在程序执行过程中出现的非正常情况,通常会导致程序中断。它与错误不同:

  • 错误(Error):一般指语法或逻辑上的问题,编译阶段即可检测到。
  • 异常(Exception):运行时发生的问题,例如除以零、访问不存在的索引等。

查看异常信息

当异常发生时,Python会提供详细的报错信息。我们可以通过try-except结构来捕获并查看这些信息。

简单异常处理

以下是一个简单的异常处理示例:

data = ['a', 'b', 'c']

for index, value in enumerate(data, start=1):
    print(index, value)

try:
    user_input = int(input("请输入数字: "))
    print(data[user_input - 1])
except ValueError:
    print("请确保输入的是整数")
except IndexError:
    print("输入的数字超出了范围")

此代码可以有效处理ValueError和IndexError。

万能异常

如果需要捕获所有类型的异常,可以使用Exception作为通用异常类型:

try:
    dictionary = {}
    dictionary["nonexistent_key"]
except Exception as e:
    print(f"捕获到异常: {type(e).__name__}, 内容: {e}")

通过这种方式,我们可以获取异常的具体类型和描述信息。

多分支异常处理

可以结合多个except块来分别处理不同类型的异常:

try:
    undefined_variable
    empty_list = []
    empty_list[0]
except NameError:
    print("变量未定义")
except IndexError:
    print("列表索引超出范围")
except Exception:
    print("其他未知异常")

注意,Exception应始终放在最后,以避免掩盖前面的特定异常。

其他异常处理机制

try-except

可以同时捕获多种异常:

try:
    undefined_variable
    empty_list = []
    empty_list[0]
except (NameError, IndexError) as e:
    print(f"发生异常: {e}")

try-except-else

如果没有异常发生,则执行else块:

try:
    result = 10 / 2
except ZeroDivisionError:
    print("不能除以零")
else:
    print(f"计算结果为: {result}")

try-except-finally

无论是否发生异常,finally块都会执行,常用于资源回收:

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
finally:
    if 'file' in locals():
        file.close()
        print("文件已关闭")

即使函数提前返回,finally仍然会被执行:

def example_function():
    try:
        return "操作完成"
    finally:
        print("执行清理操作")

result = example_function()
print(result)

输出结果为:

执行清理操作
操作完成

主动抛出异常

可以使用raise关键字手动触发异常:

try:
    number = int(input("请输入一个整数: "))
    if number < 0:
        raise ValueError("输入的数字不能为负")
except ValueError as e:
    print(f"错误: {e}")

自定义异常

还可以创建自定义异常类:

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

try:
    raise CustomError("这是一个自定义错误")
except CustomError as e:
    print(f"捕获到自定义异常: {e.message}")

这里的CustomError继承自Exception,也可以直接继承BaseException。

断言机制

断言是一种调试工具,用于验证条件是否成立。如果条件为假,则抛出AssertionError:

value = True
assert value, "断言失败"

# 等价于
if not value:
    raise AssertionError("断言失败")

断言的优点在于简洁,无需额外缩进。

注意事项

  • 异常处理主要用于开发和调试阶段,不适合向最终用户提供提示。
  • assert语句在优化模式下会被忽略,因此不应依赖其进行关键逻辑验证。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。