深入理解Python中的try-except语句,避免代码崩溃的噩梦

如何使用try-except语句处理异常? 在Python中,try-except语句用于捕获和处理异常。当try块中的代码引发异常时,程序会立即跳转到匹配的except块,而不是终止执行。在except块中,你可以编写处理异常的代码,比如记录错误信息、清理资源、或者尝试使用不同的方法继续执行。 阅读详情

不管是开发Python、Java、JavaScript程序,还是写C++、PHP、GO、Ruby代码。都离不开try … except异常处理。至于为什么,一切为了程序/产品/项目的稳定运行。如果一个程序项目或者说小一点一个文件中没有一个try-except处理,那么这个程序是有漏洞的、是不稳定的,很容易就会崩溃的程序。

而我们经常在代码开发时,特别是框架项目开发时,多个模块(文件)是会存在调用的情况,有单向的,也有双向的。而在此时如果程序发生异常,try-except只会基于当前位置进行信息打印(我说的是Except as e),很难去定位到模块调用,也就是源头文件的位置。今天分享的内容就是如何定位源头文件及行数。

Python try-except例子:

在这个例子中,我们将除法运算代码封装到了一个名为divide的函数中。函数的第一个参数a表示被除数,第二个参数b表示除数。在函数体中,我们使用try except语句对除以0的异常进行了处理。如果程序没有遇到ZeroDivisionError异常,那么函数将成功计算结果并返回。如果程序遇到ZeroDivisionError异常,我们将输出具体的错误信息并返回None。

def divide(a, b):
    try:
        c = a / b
        return c
    except ZeroDivisionError as e:
        print(e)
        return None

# 调用函数进行除法运算
result = divide(10, 0)
print(result)

输出结果:

Divide by zero error

定位源头文件(报错源)

大多时候我们在大工程或者复杂程序里,仅仅打印e只能简单的显示出程序出错的信息,有时我们仅仅根据这个信息很难定位,错误究竟发生在哪一个文件、哪一行代码,这时候比较笨的调试方法就是去掉try-except再跑一次让程序崩溃显示出具体的信息。

而比较快速便捷的定位错误信息就是定位到发生错误具体的行和文件,其实我们可以利用错误对象e,它其实是有相关的属性可调用的。

def divide(a, b):
    try:
        c = a / b
        return c
    except ZeroDivisionError as e:
        # 通过e的属性打印具体文件名称和行号
        print(f"Error Occurred At, 
              f"File: {e.__traceback__.tb_frame.f_code.co_filename}, "
              f"Line: {e.__traceback__.tb_lineno}")
        print("Divide by zero error")
        return None

# 调用函数进行除法运算
result = divide(10, 0)
print(result)

输出结果:

Error Occurred At, File: 文件路径, Line: 错误行号
Divide by zero error
None

或者还可以借助内置模块traceback实现

import traceback
import sys

def divide(a, b):
    try:
        c = a / b
        return c
    except ZeroDivisionError as e:
        # 借助traceback实现 
        tb_list = traceback.extract_tb(sys.exc_info()[2])
        filename, line_no, func_name, code_str = tb_list[-1]
        print(f"Error Occurred At, 
              f"File: {filename}, "
              f"Line: {line_no}")
        print("Divide by zero error")
        return None

# 调用函数进行除法运算
result = divide(10, 0)
print(result)

进阶用法

这个时候还会有一些问题,就是源头报错文件是一个三方库或者内置库,比如文件位置是python环境site-packages中,那我们打印出来并没有太大的用处,我们想打印的是我们自己写的代码报错位置,而不是内置模块或安装的第三方模块报错的位置信息,只有找到自定义代码位置,才好进行优化修正。

可以使用traceback.extract_stack()替换traceback.extract_tb(),以排除第三方库的源代码位置。

import traceback
import sys

def divide(a, b):
    try:
        c = a / b
        return c
    except ZeroDivisionError as e:
        # 借助traceback实现 
        tb_list = traceback.extract_stack()[:-1]  # 最后一项是当前调用的位置,而不是异常发生的位置
        filename, line_no, func_name, code_str = tb_list[-1]
        print(f"Error Occurred At, 
              f"File: {filename}, "
              f"Line: {line_no}")
        print("Divide by zero error")
        return None

# 调用函数进行除法运算
result = divide(10, 0)
print(result)

使用traceback.extract_stack()方法获取异常发生的完整堆栈信息。然后,使用list slicing来去掉最后一个元素,因为这个元素代表当前调用的位置,而不是异常发生的位置。最后一个元素通常是包含你的调用代码的位置,所以你不想把它包含进来。然后,从可用的堆栈信息中提取最后一个源代码文件名、行号、函数名和代码行来确定异常发生的位置。

这个方法不会包含第三方库的源代码位置,并且只会提取与你的代码相关的源代码位置。

还可以使用Python标准库中的inspect模块的currentframe()函数来获取当前帧。然后,你可以使用traceback.extract_stack()方法来提取堆栈信息,然后使用堆栈信息来逐步比较源文件路径,以找到与当前工程相关的源文件路径。

import os
import inspect
import traceback


def get_project_traceback():
    # 获取当前帧
    frame = inspect.currentframe()
    # 提取堆栈信息(前两个元素是filter和get_project_traceback函数本身的位置)
    tb_list = traceback.extract_stack(frame)[2:]
    # 找到与当前工程相关的源文件路径
    for filename, line_no, func_name, code_str in reversed(tb_list):
        if os.getcwd() in filename:
            return filename, line_no, func_name, code_str
    # 如果都没有找到,则返回最后一个源文件
    filename, line_no, func_name, code_str = tb_list[-1]
    return filename, line_no, func_name, code_str

def divide(a, b):
    try:
        c = a / b
        return c
    except ZeroDivisionError as e:
        filename, line_no, func_name, code_str = get_project_traceback()
        print(f"Error Occurred At, 
              f"File: {filename}, "
              f"Line: {line_no}")
        print("Divide by zero error")
        return None

# 调用函数进行除法运算
result = divide(10, 0)
print(result)

上述代码中,get_project_traceback函数首先使用inspect.currentframe()函数获取当前帧,然后使用traceback.extract_stack(frame)方法提取堆栈信息,前两个元素是filter和get_project_traceback函数本身的位置,所以从第3个元素开始获取。接着,函数使用os.getcwd()来获取当前工程的路径,并逐个比较每个源文件路径,找到与当前工程相关的源文件路径。如果都没有找到,则返回最后一个源文件。

在主代码块中,通过调用get_project_traceback函数来获取与当前工程相关的堆栈信息。当一个异常发生时,该代码段将获取该异常的信息并使用get_project_traceback函数来打印与当前工程相关的堆栈信息。

今天分享了笔者在工作学习当中遇到的try-except问题,希望对大家有帮助!也欢迎大家积极评论,互帮互助!

树莓派GPIO交互实战:用Python打造可编程声音触发装置 GPIO(通用输入输出)是嵌入式系统与物理世界交互的基础接口,其原理是通过读写引脚的高低电平状态来感知和控制外部设备。在树莓派等单板计算机上,GPIO技术为软硬件结合开发提供了核心支持,其价值在于将数字逻辑转化为真实的物理交互。通过Python等高级语言调用GPIO库,开发者可以快速实现传感器数据采集、执行器控制等应用,极大降低了硬件开发门槛。典型的应用场景包括智能家居控制、互动艺术装置、教育实验设备等。本文以树莓派为平台,结合gpiozero和pygame库,详细讲解如何通过GPIO读取按钮状态并触发音频 阅读详情

相关推荐

零基础复刻6个Agent项目:从文件读取到本地大模型实战

Agent(智能体)是AI工程中实现自主任务执行的核心范式,其本质是‘感知-决策-行动-反馈’的闭环系统。理解Agent需回归基础原理:如何解析自然语言指令、调用工具、管理状态、集成模型并保障执行安全。本文聚焦零基础学习路径,避开LangChain等高抽象框架,通过复刻aider、mini-claude-code、CoreCoder等6个轻量级开源项目,以原生Python逐层拆解工具调用协议、文件级环境感知、代码生成沙箱、本地大模型推理(如deepseek-coder-1.3b)等关键技术。所有项目均支持C

weixin_33748818的博客 556

95. Python基础教程:异常处理try...except语句

【语法总结】try : # 可能会发生异常的代码块 # 1. 单独的except except : print("输入有问题,程序不能正常输出结果。") # 2. except+异常名称 except ZeroDivisionError : print("输入有问题,程序不能正常输出结果。

weixin_63986098的博客 5万+

oh-my-pi:开源可定制的AI编程工作流编排器

AI编程工具正从代码补全向工作流编排演进。传统补全模型如Copilot聚焦于行级预测,依赖云端黑盒服务;而以oh-my-pi为代表的新型框架,则基于Agent-Tool-Orchestrator架构,将任务分解、工具调用与流程调度显式化、可审计化。其核心价值在于本地化部署、模型可替换、行为可调试,特别适合对数据隐私、合规性与工程可控性有高要求的场景。通过集成轻量级LLM(如phi-3:mini)与现有开发工具链(如pycodestyle、git),它构建起一条从需求指令到可交付产出的端到端AI流水线——这不

chutisun0039的博客 407

Python教学 | 有备无患!详解 Python 异常处理(try-except)

通过正确地使用try-except,我们可以提高代码的健壮性和可靠性,避免程序崩溃,并且更好地掌控程序流程。

weixin_55633225的博客 4万+

ArcGIS批量导图实战:ArcPy与数据驱动页面自动化出图指南

在地理信息系统(GIS)工作中,地图出图是数据可视化与成果交付的关键环节。其核心原理在于通过自动化脚本或内置工具,将地图文档(MXD)批量转换为TIF、PNG、JPG或PDF等格式,从而替代重复的手动操作。这项技术的核心价值在于显著提升生产效率、确保输出结果的一致性,并减少人为错误。在工程实践中,它广泛应用于制作行政区划图集、生成周期性监测报告、为WebGIS系统准备底图切片等场景。本文聚焦于ArcGIS平台,深入解析如何利用ArcPy脚本编程与数据驱动页面两大核心工具,实现高效、可靠的批量导图,涵盖从基础

weixin_34208283的博客 365

ROS2 Intra-Process通信:零拷贝原理、启用条件与三大静默陷阱

Intra-Process通信(IPC)是ROS2区别于ROS1的核心机制,本质是绕过序列化、RMW中间件和网络栈,实现同一进程内节点间的零拷贝消息传递。其原理依赖节点级显式声明、QoS策略强匹配及RMW实现支持,技术价值在于微秒级延迟、确定性调度与内存带宽节省99%以上,广泛应用于实时控制、传感器融合与视觉处理等对时延敏感场景。实际落地中,需严格满足同一节点创建发布/订阅、消息类型完全一致、QoS五字段精确匹配等硬约束——而rmw_cyclonedds_cpp支持完备,rmw_fastrtps_cpp存在

weixin_30915951的博客 372

关于异常捕获的小知识点——try,except写在函数内外

关于异常捕获的小知识点——try,except写在函数内外

simpleness_的博客 2453

详解python异常处理try、except

本文主要介绍了python异常处理try、except,希望能对新手有所帮助。 文章目录 1. try语句 2. 引出错误语句 3. python标准异常 4. else用法

weixin_43178406的博客 1万+

Python模块与包实战:从代码组织到打包分发的工程化指南

在Python开发中,模块化是管理代码复杂性的核心概念。模块作为代码组织的基本单元,通过命名空间机制隔离变量与函数,避免命名冲突。包则作为模块的容器,通过目录层次和__init__.py文件实现逻辑分组,这是构建可维护项目结构的基础原理。掌握模块与包的技术价值在于提升代码的可复用性和团队协作效率,特别是在构建内部工具库或开源项目时。在实际应用场景中,合理运用绝对导入与相对导入、动态导入机制以及__all__接口控制,能够解决循环导入等常见问题。本文以数据处理工具包为例,深入探讨了从项目结构规划到使用pypr

weixin_34072458的博客 446

基于PLC1200与CB1241的RS485从站Modbus Rtu通信实战指南

本文提供了一份详细的西门子S7-1200 PLC与CB1241 RS485通讯板实现Modbus RTU从站通信的实战指南。内容涵盖从硬件接线、博途软件组态、关键参数设置到程序调试与测试的全过程,重点解析了Modbus_Slave指令配置与数据块映射,帮助工程师快速掌握工业自动化系统中的数据采集与设备接入技术。

Apple的专栏 796

从零到一:树莓派上的YOLO目标检测实战指南

本文详细介绍了如何在树莓派上部署和优化YOLO目标检测模型,从硬件选型到系统配置,再到模型转换与推理优化。通过对比不同树莓派型号的性能差异,提供实用的配置方案和代码示例,帮助开发者快速实现高效的边缘计算视觉系统。特别推荐使用ONNX格式进行模型转换,以提升在树莓派上的推理效率。

weixin_29046035的博客 1063

彻底解决Python UnicodeEncodeError:从编码原理到实战解决方案

字符编码是计算机处理文本信息的基础,它定义了字符与字节序列之间的转换规则。其核心原理在于解决不同系统、语言环境下的字符表示统一性问题,通过编码(Encode)将字符转换为字节,解码(Decode)则将字节还原为字符。理解编码原理的技术价值在于确保数据在存储、传输和显示过程中的一致性与完整性,避免乱码和数据损坏。在实际应用场景中,文件读写、网络通信、数据库交互和跨平台开发都会涉及编码处理。本文聚焦于Python开发中常见的UnicodeEncodeError问题,深入剖析GBK与UTF-8编码差异导致的错误根

weixin_30443731的博客 330

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9937

Python批量解析FCS流式细胞术数据并导出Excel表格实战指南

在生物信息学和实验数据分析领域,数据格式转换是连接专业仪器与通用分析工具的关键环节。流式细胞术产生的FCS文件作为一种标准的二进制数据格式,存储了细胞在多荧光通道下的高维信息,但其非结构化特性阻碍了在Excel、R或Python等通用平台中的直接统计分析与可视化。理解FCS文件结构(包含文本段、数据段等)是解析的基础,其技术价值在于打通从原始实验数据到可处理结构化数据(如DataFrame)的自动化流程。通过Python生态中的fcsparser、pandas等库,可以高效实现元数据提取、二进制数据解析及批

weixin_33946605的博客 408

从实验室到生活:构建一份全面的手机相机主观画质评测指南

本文详细介绍了如何从实验室数据转向实际体验,构建全面的手机相机主观画质评测指南。通过基础装备清单、室内外场景实战评测及数据之外的感知艺术,帮助用户发现手机相机在色彩还原、动态范围和夜景模式等方面的真实表现。特别关注主观体验与客观参数的差异,提供实用的评测技巧和报告撰写心法。

weixin_30940783的博客 308

车载与安防项目实战:如何用RK3588搭配NVP6158C实现4路AHD摄像头BT1120接入与同步预览

本文详细解析了基于RK3588处理器与NVP6158C解码芯片实现4路AHD摄像头BT1120接入与同步预览的技术方案。针对车载环视和安防监控场景,重点探讨了硬件架构设计、BT1120接口配置、多路同步机制及Android HAL适配等核心问题,提供了从底层驱动到上层应用的完整实现路径,为相关领域的工程实践提供可靠参考。

weixin_30571465的博客 486

LLM直接生成二进制文件:从代码生成到软件构建的范式转移

编译器技术作为连接高级语言与机器指令的核心桥梁,其本质是将人类可读的源代码转化为可执行的二进制文件。传统编译流程遵循词法分析、语法分析、优化到代码生成的标准化路径,而大语言模型(LLM)的出现正在重塑这一技术范式。通过集成编译原理与深度学习能力,LLM能够理解自然语言需求并直接生成中间表示(IR)或机器码,实现从需求描述到可执行文件的端到端自动化。这种AI编译技术在提升开发效率的同时,也带来了调试复杂性和安全审计的新挑战。在软件工程实践中,LLM生成二进制文件的能力为快速原型开发和工具制作提供了新路径,特别

weixin_33691700的博客 356

Python 爬虫实战:爬取今日头条文章与阅读量数据

本文详细介绍了基于Python爬取今日头条文章与阅读量数据的完整方案。通过分析今日头条API接口,采用Requests+正则表达式技术实现数据抓取,重点解决加密参数构造、请求头模拟、反爬规避等核心问题。文章包含文章列表获取、详情数据提取、互动数据采集等完整流程,并提供数据存储与基础分析方法。同时强调合规使用爬虫技术,控制爬取频率,避免干扰平台运营。该方案可为内容传播分析、用户兴趣研究提供数据支持,但需注意接口参数更新和反爬机制变化,适时调整代码实现。

2503_91057718的博客 2519

Rust重构Binwalk:性能碾压与固件分析新范式

在嵌入式安全与物联网设备分析领域,固件逆向工程是识别漏洞、分析恶意代码的核心技术。其基本原理是通过解析二进制固件镜像,识别其中的文件系统、压缩数据及可执行代码段,从而还原设备运行逻辑。传统工具多基于Python等解释型语言开发,虽灵活易用,但在处理大规模、嵌套复杂的固件时,常面临性能瓶颈与依赖管理难题。Rust作为一门强调内存安全与零成本抽象的系统编程语言,通过其所有权模型与编译期检查,为构建高性能、高可靠的系统工具提供了全新可能。将Rust应用于固件分析工具链,能实现并行签名扫描、零拷贝数据解析与确定性资

401

DXF转G代码是圆弧的方向如何确定?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1187

osgEarth加载大疆数据

【代码】osgEarth加载大疆数据。

weixin_44769745的博客 308

英特尔® Edison多语言编程环境数据共享:管道与ZeroMQ实战指南

在嵌入式系统与物联网开发中,进程间通信是连接不同功能模块、实现数据高效流转的核心技术。其原理在于操作系统为运行在同一设备上的独立进程提供了多种数据交换机制,从简单的字节流管道到结构化的消息队列。掌握这些技术对于构建模块化、高性能的嵌入式应用具有重要价值,尤其在需要整合Python、C++、Node.js等多种编程环境的场景下,如传感器数据采集、实时控制与Web服务集成。本文聚焦于英特尔® Edison开发板,深入探讨了命名管道与ZeroMQ消息队列这两种关键技术,通过对比其性能与适用场景,并结合传感器数据流

weixin_30932215的博客 341

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

我在优快云踩过的10个技术坑:血泪经验总结

本文总结了技术开发中的十大常见坑;,涵盖环境配置、数据库操作、缓存使用、并发处理等关键领域。文章通过具体案例对比错误与正确做法,如镜像源配置、N+1查询优化、事务管理等,并给出通用避坑原则:环境先行、重视监控、保障安全、追求简单、流程自动化。作者建议技术成长路径应夯实基础、注重工程实践、提升架构能力,同时保持好奇心和分享精神。最后强调"踩坑"是必经之路,关键是从中学习并帮助他人避免同类问题。

Dr.kangder的博客 358

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

AI大模型应用开发实战:从Prompt工程到RAG与Dify部署

这次我们来看一套完整的AI大模型应用开发课程。这套课程名为“AI大模型应用开发(全集教程)”,内容涵盖了从Python基础、Prompt工程到RAG、Coze、Dify等主流开发框架的21节系统性内容。对于想从零开始,系统掌握如何将大模型能力集成到实际应用中的开发者来说,这是一个非常全面的学习资源。 课程的核心价值在于其体系化。它不是零散的技巧分享,而是从基础环境搭建、核心概念理解,到主流工具链(如LangChain、Dify)的实战应用,再到高级架构(如RAG)的深入剖析,形成了一条清晰的学习路径。无论你

weixin_30924087的博客 413

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Playwright如何成为多智能体平台的Web自动化核心技能

浏览器自动化是现代软件开发和测试中的关键技术,它通过模拟用户操作实现Web应用的自动交互。其核心原理在于通过驱动协议控制浏览器,执行点击、输入、导航等操作。这项技术的价值在于显著提升测试效率、实现流程自动化,并广泛应用于UI测试、数据抓取和监控等场景。随着多智能体(Multi-Agent)系统的发展,AI智能体需要与真实数字世界交互,稳定的动作执行层成为关键。Playwright凭借其开箱即用的稳定性和对现代Web技术的极致支持,从众多工具中脱颖而出。它通过自带浏览器二进制文件和智能等待机制,解决了环境一致

weixin_34152820的博客 333

单机多Agent环境隔离与认证管理:基于Lots of Agents的工程实践

在AI应用开发中,Agent(智能体)作为能够自主执行任务的程序,其规模化部署常面临环境隔离与状态管理的核心挑战。传统方案如多浏览器实例资源消耗大,Docker容器则显笨重。本文从轻量级虚拟化与认证信息存储(Auth Store)原理切入,探讨如何通过文件系统隔离、独立运行时上下文及中心化配置管理,实现多Agent的高效并行运行。该技术方案尤其适用于需要维护独立登录态(如Cookie、Token)的自动化场景,例如社交媒体管理、电商监控与自动化测试。通过借鉴Lots of Agents项目的设计思路,开发者

weixin_34296641的博客 520
上一篇: 正则可视化工具推荐
下一篇: GitHub 开源神器 Bark模型,让文本转语音更简单
孜孜孜孜不倦
博客等级 码龄7年 1803粉丝 277原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孜孜孜孜不倦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值