【Python入门】18.错误处理try...except 与 raise的用法

图神经网络实战(6)——使用PyTorch构建图神经网络 图数据集通常比简单的连接集合更加丰富,因为节点和边可以具有表示分数、颜色、单词等特征。包含这些额外信息在输入数据中对于生成最佳嵌入至关重要。在本节中,我们将使用 Cora 和 Facebook Page-Page 数据集,首先将它们视为表格数据集,观察香草神经网络在节点特征上的表现如何。然后,尝试在神经网络中加入拓扑信息,实现图神经网络 (Graph Neural Networks, GNN) 架构:一个同时考虑节点特征和边的简单模型。最后,我们将比较两种架构的性能。 阅读详情
AI摘要

本文深入讲解Python中的错误处理机制,包括try...except语句的使用,如何分析错误源头,利用logging记录错误,以及如何自定义并抛出错误。通过实例演示了错误处理在多层调用中的应用。

笔记更新于2019年12月3日,
摘要:错误处理;try…except语句;分析错误信息源头;logging记录错误;raise抛出错误


写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ


错误处理

在程序运行过程中,可能会遇到各种错误。如原本要输出整数的却输出了字符串,如因用户输入信息有误导致后面无法运行,如从网络抓取数据时网络突然断线导致无法抓取等等。这其中有可以修复的bug,也有无法预测的错误情况。在Python中,有一套内置的错误处理机制,来帮助我们处理错误情况。我们来看看怎么进行错误处理。

try

当我们觉得一段代码可能会出错时,就可以用try语句。如果这段代码出错,则直接跳过后面的代码,转到except X语句块,except X是用来捕获错误类型X的。最后可加上finally语句,如果有finally语句,则执行之。

def fn(a):
    try: 
        print('try')
        r = 10 / a
        print('result:', r)
    except ZeroDivisionError as e:
        print('except:', e)
    finally:
        print('finally')
    print('end')
    return

先看一下有错误的情况,当给fn传入0时,会出现除数为0的错误:

>>>fn(0)
try 
except: division by zero 
finally 
end 

分析其执行过程。执行try语句中的“r = 10 / a”发现错误,跳过“print(‘result:’, r)”语句,执行except X语句,捕获到错误类型为ZeroDivisionError,则执行后面紧跟的语句“print(‘except:’, e)”,最后执行finally语句。

• except 错误类型

事实上,Python中的错误也是class,所有的错误类型都继承自BaseException,Python官网给出了常见的错误类型和继承关系。

当可能出现多种错误时,可以加入多个except X语句来捕获不同可能产生的错误。那如果还出现我们能够捕获之外的错误呢?可以在最后添加“except BaseExcept as e:”,或者直接写"except:"也是可以的。不加的话最终会让Python解释器打印出该错误。

def fn(a):
    try: 
        print('try')
        r = 10 / a
        print('result:', r)
    except ZeroDivisionError as e:
        print('except:', e)
    except ValueError as e:
        print('except:', e)
    except :
        print('unknow except')
    finally:
        print('finally')
    print('end')
    return
>>>fn('a')
try 
unknow except 
finally 
end 

当我们尝试传入字符串参数时,发生错误,但错误类型既不是ZeroDivisionError,也不是ValueError,所以最终执行except :语句。最后执行finally语句。若让Python解释器来打印该错误,会发现是TypeError。

• 无出现错误情况

此外,我们可以在所有except后加上else,若没有出现错误,则会执行else语句。

看一下没有错误的情况,我们执行fn(2)试试。

def fn(a):
    try: 
        print('try')
        r = 10 / a
        print('result:', r)
    except ZeroDivisionError as e:
        print('except:', e)
    except ValueError as e:
        print('except:', e)
    except :
        print('unknow except')
    else:
        print('no errors')
    finally:
        print('finally')
    print('end')
    return

>>>fn(2)
try 
result: 5.0 
no errors 
finally 
end 

由于没有出现错误,所以执行try里的全部语句,然后跳过except,到else语句。最后执行finally语句。

• 多层调用

try…except语句可以跨越多层调用。比如函数a( )调用了b( ),b( )调用了c( ),c( )出现错误,只要a( )捕获到了就可以处理。

def a(s):
    try:
        b(s)
    except Exception as e:
        print('Error', e)

def b(s):
    return c(s) + 2
def c(s):
    return 9 / s

>>>a(0)
Error division by zero 

分析错误

当错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印错误信息,然后退出程序,如这个err.py:

# err.py:
def a(s):
    b(s)

def b(s):
    return c(s) + 2

def c():
    return 9 / s

a(0)

执行结果:

$ python3 err.py

Traceback (most recent call last):
  File "err.py", line 11, in <module>
    a(0)
  File "err.py", line 3, in a
    b(s)
  File "err.py", line 6, in b
    return c(s) + 2
  File "err.py", line 9, in c
    return 9 / s
ZeroDivisionError: division by zero

我们从上往下分析这个错误,找出关键错误所在。

错误信息第1行:告诉我们这是错误的跟踪信息。

Traceback (most recent call last):

错误信息第2~3行:表示在文件err.py的第11行代码,模块中的a(0)语句出现错误,但原因是在第3行。

File "err.py", line 11, in <module>
    a(0)

错误信息第4~5行:表示在文件err.py的第3行代码函数a( )中的b(s)语句出现错误,但原因是在第6行。

File "err.py", line 3, in a
    b(s)

错误信息第6~7行:表示在文件err.py的第6行代码函数b( )中的return c(s) + 2语句出现错误,但原因是在第9行。

  File "err.py", line 6, in b
    return c(s) + 2

错误信息第8~9行:表示在文件err.py的第9行代码函数c( )中的return 9 / s语句出现错误,下面打印出错误原因。

  File "err.py", line 9, in c
    return 9 / s

错误信息第10行:表示出现除数为0的错误,属于ZeroDivisionError错误类型,即计算10 / 0 时出错,找到错误源头。

ZeroDivisionError: division by zero

记录错误

既然可以捕获错误,那么就可以把错误记录下来。

Python内置的logging模块就是用来记录错误的。

import logging
def a(s):
    try:
        b(s)
    except Exception as e:
        logging.exception(e)
		
def b(s):
    return c(s) + 2
def c(s):
    return 9 / s

a(0)
print('end')

执行结果:

ERROR:root:division by zero 
Traceback (most recent call last): 
  File "error.py", line 6, in a 
    b(s) 
  File "error.py", line 11, in b 
    return c(s) + 2 
  File "error.py", line 13, in c 
    return 9 / s 
ZeroDivisionError: division by zero 
end 

最后的print(‘end’)语句是有执行的,可见在有logging的情况下,遇到错误时,程序会打印错误信息后会继续执行,最后正常退出。而没有logging的情况下,遇到错误时会中途退出。

通过配置,logging还可以把错误记录到日志文件里,方便事后排查。

抛出错误

既然错误是class,那我们也可以自己定义一个错误类型,遇到自认为是错误情况时,抛出一个错误实例。用raise语句可以将一个错误实例抛出。

def fn(s):
    n = s
    if n == 0:
        raise MyError('invalid value: %s' % s)
    return 9 / n

fn(0)

执行结果:

Traceback (most recent call last): 
  File "myerror.py", line 11, in <module> 
    fn(0) 
  File "myerror.py", line 8, in fn 
    raise MyError('invalid value: %s' % s) 
__main__.MyError: invalid value: 0 

错误信息最后跟踪到自己定义的错误。

只有在必要的时候才自己定义错误,一般情况下还是用Python内置的错误类型,也是可以用raise语句抛出的。

虽然raise和try语句都有打印错误信息的作用,但两者的用途并不冲突,raise语句负责抛出错误信息,而try语句负责检查是否有错误信息并捕获信息。若没有try语句,那么错误信息就要让python的解释器来处理。

def fn(s):
    n = int(s)
    if n==0:
        raise ValueError('invalid value: %s' % s)
    return 10 / n

def a():
    try:
        fn('0')
    except ValueError as e:
        print('ValueError!')
        raise

a()

raise语句也可以不带参数,此时按原错误信息抛出。此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型,像这样:

try:
    10 / 0
except ZeroDivisionError:
    raise ValueError('input error!')

补充

1.split( )函数过指定分隔符对字符串进行切片。传入参数有两个,第一个为分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等;第二个为分割次数,默认全部分割。

2.虽然程序可以主动抛出错误让用户知道,但我们要在程序文档中写清楚可能出现的错误以及错误产生的原因和解决办法等。


以上就是本节的全部内容,感谢你的阅读。

下一节内容:19.Python中的调试与测试

有任何问题与想法,欢迎评论与吐槽。

和博主一起学习Python吧( ̄▽ ̄)~*

安卓15_ROM修改定制化_____修改rom的前提条件 去除各种验证 安卓设备通用 通过博文了解💝💝💝 1-------💝💝💝了解安卓设备的启动流程与核心验证机制 2-------💝💝💝了解安卓设备修改rom中的各种验证机制以及对应的去除方法 3-------💝💝💝了解avb验证与dm验证的本质区别与对应的操作方式 4-------💝💝💝修改rom前的循序步骤 避免验证机制导致的不开机 阅读详情

相关推荐

安卓设备通过USB串口与STM32单片机通讯之一

这里写自定义目录标题欢迎使用Markdown编辑器`在这里插入代码片`新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器在这里插入代码片 你好下Markdown的基本语法知识。 新的改变 我们对

JGB联合商务组的博客 7246

Python异常处理:try-except与raise

Python是一门易学易用的编程语言,但在编写代码时难免会出现错误。为了更好地处理这些错误,Python提供了一些内置的异常类型,同时也支持开发者自定义异常。在Python中,try-except和raise是两个重要的异常处理机制,它们能够帮助开发者更好地处理程序中的错误。

qq_33578950的博客 3867

KVM环境下Tesla T4/v100 vGPU性能调优手册:显存分配策略与帧率限制解除

本文深入探讨了在KVM虚拟化环境中,针对NVIDIA Tesla T4和V100 GPU进行vGPU性能调优的实战策略。核心内容包括如何根据AI训练、科学计算等不同负载,精细规划显存分配策略,并详细介绍了通过修改sysfs参数解除帧率限制器(FRL)以释放硬件潜力的方法,旨在帮助用户实现虚拟化GPU资源的最大化利用。

cuda7parallel的博客 619

Python中的异常、try、except、finally、raise语法以及示例

python异常处理

liucaixin2016的博客 2375

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6087

动态表单设计

自定一表单数据结构。内容展示如有必要行转列。前端根据题目类型自定义组件后端跟俊题目类型用策略模式校验各种类型这样有统计功能的简单动态问卷就可以了展示时可能某些场景需要行转列。大概估摸使用的话有可能kmic_form_data_detail表的记录数比较大,后期再考虑数据或者表迁移或拆分。

zquwei的博客 3461

Python —— 捕获异常(try-except、raise)&日志模块(logguru)

一般是开发者控制不了的地方,例如:用户输入数据、用户传参、函数返回值调用,需要加上异常捕获。1、查看控制台的报错信息,报错信息会显示行号、点击文件可以跳到问题行。真实项目情况下,需要对不同的报错信息进行不同的处理:记录日志,警告,发送邮件等。try中的代码不报错,不会执行except中的语句。- 最后加上Exception 兜底。如果报错,会执行except中的代码。- 尽量去区分异常进行捕获,优先使用。机制不会因为报错影响后面的代码运行。1、先运行 try中的代码,

南夏一木子的博客 5001

Xarray实战:从气象数据到可视化分析的完整流程(附Python代码)

本文详细介绍了使用Xarray库处理气象数据的完整实战流程。针对气象领域常见的NetCDF和GRIB格式,文章从数据读取、坐标操作、智能索引、统计计算到高级可视化,提供了完整的Python代码示例。重点阐述了Xarray如何高效处理高维标记数据,帮助地球科学领域的研究人员将繁琐的数据处理工作转化为高效的分析流水线。

d6e7f8g9h的博客 290

python 异常处理小结 try except raise assert

1.try-except try except组合是用来处理异常的一对黄金搭档,python中也不例外。可以看个简单的例子: def t1(): try: a, b = 1.0, "2.0" c = a / float(b) print("c is: ", c) except ValueError as err: print("b must be digit!") except ZeroDivisionError as

bitcarmanlee的博客 1943

VINS-Mono 时延估计论文翻译

Online Temporal Calibration for Monocular Visual-Inertial Systems 摘要 精确的状态估计是机器人导航、自主驾驶、虚拟现实和增强现实等各种智能应用的基础模块。视觉惯性融合是近年来流行的六自由度状态估计技术。记录不同传感器测量值的时刻对系统的鲁棒性和准确性至关重要。在实践中,每个传感器的时间戳通常会受到触发和传输延迟的影响,从而导致不同传感器之间的时间偏差(时间偏移)。这种时间偏移严重影响传感器融合的性能。为此,我们提出了一种标定视觉和

weixin_39061796的博客 1255

Open3D——RANSAC 三维点云空间直线拟合【2025最新版】

使用RANSAC算法在点云数据中拟合三维空间直线的python代码实现。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 7354

第18课:Python|异常处理【try-except-finally、自定义异常与程序容错机制】

Python异常处理:构建健壮程序的关键技术 摘要 本文系统讲解了Python异常处理机制,帮助开发者编写更健壮的程序。主要内容包括: 异常基础:区分语法错误与运行时异常,介绍常见异常类型(ValueError、TypeError等) 异常捕获:详解try-except-else-finally结构,演示多异常捕获和异常对象获取 高级特性:异常抛出(raise)、异常链和自定义异常的实现方法 断言调试:assert的使用场景与注意事项 最佳实践:异常处理的原则和常见陷阱 通过实际代码示例,展示了如何....

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 514

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法。

kevin1499的博客 1617

Python中的异常处理

Python中的异常处理

qq_44954371的博客 4666

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

浅谈python中的错误与异常

一、语法错误 异常:大多数的异常都不会被程序处理,都以错误信息的形式展现在这里 二、异常处理 1 2 3 4 5 6 while True: try: x = int(input("请输入一个错误:")) break except ValueError: print("不是有效数字,再试一遍") try 语句执行顺序:...

D64juaz的博客 208

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

第 11 章 错误处理与异常

本文系统介绍了Python程序中的异常处理机制。首先区分了语法错误、逻辑错误和异常三种问题类型,重点讲解了异常处理的EAFP(请求原谅比请求许可更容易)原则及其优势。详细说明了try-except-else-finally语法结构,列举了TypeError、ZeroDivisionError等常见异常类型。文章还探讨了主动抛出异常、异常顺序处理、卫语句优化等进阶技巧,并介绍了上下文管理器和Pylint工具的使用。最后阐述了单元测试的重要性,为构建健壮的Python程序提供了全面的异常处理方案。

Raink老师的博客 716

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python提取身份证中的生日和性别

【代码】python提取身份证中的生日和性别。

m0_57823924的博客 3311

2024Python开发面试解答python异常捕获,怒斩腾讯和阿里的Offer

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费。

2301_76225520的博客 708

深入理解Python异常处理机制:助力你的自动化测试脚本

前些天,公司准备使用开源BI工具superset,但部署成功后,连接阿里数仓获取表时,一直报错,苦于日志不详细,从日志中并没有看出哪里的问题,然后就拉源码进行调试,终于找到的位置,但是当我打印这个异常的时候并没有异常信息输出,这促使我重新看一遍python的异常与错误处理。

m0_65111097的博客 1672

【Python】错误、调试和测试

链接到错误处理 链接到调试 链接到单元测试 链接到文档测试 【错误处理】 小结:遇到错误怎么办? 1、不理它。 2、捕获它,再抛出。 3、捕获并处理错误。 raise 不懂如何处理错误就直接抛出(raise),交由合适的层次处理,有时候需要自定义错误,但是通常使用Python内置的错误就可以了: #!/usr/bin/env python3 ...

bangtuo9862的博客 138

Python 异常处理

Python 常见异常,异常的处理和自定义异常

qq_45055172的博客 352

Python从入门到弃坑学习笔记——第九章 异常处理

这是一系列很新,经过本人消化过的从零进行Python学习的笔记。第九章主要介绍了异常测试。

m0_73811325的博客 619

python基础(18)之 异常处理

异常处理 try块可让您测试代码块的错误。except块可让您处理错误。finally无论 try- 和 except 块的结果如何,该块都允许您执行代码。 一、异常处理 例如该try块将产生异常,因为x未定义: try: print(x) except: print("An exception occurred") 返回 由于 try 块引发错误,因此将执行 except 块。如果没有 try 块,程序将崩溃并引发错误。 二、else搭配 else如果没有...

PY洋洋 587

【Python3基础】16-序列化、异常与调试

本文系统讲解Python数据持久化与异常处理核心技能。通过pickle实现对象序列化,支持任意Python类型,但仅限于Python环境间传输;通过json实现跨语言数据交换,兼容性强,但仅支持基础数据类型。二者结合可解决文件存储与网络通信中的数据格式问题。同时,文章涵盖异常捕获、断言、日志与调试技巧,构建完整错误应对体系,助力程序稳定运行与高效定位问题。

ShyanZh的博客 162

python第十二课 高级(错误与异常)

Python异常处理摘要 核心概念 语法错误:代码编写阶段因格式问题无法执行,必须修正代码本身 异常:运行时因逻辑或环境问题触发,可通过try-except捕获处理 常见异常类型 包括ZeroDivisionError、AttributeError、IndexError等,每种对应特定错误场景 异常处理机制 使用try-except-else-finally结构实现完整处理流程 可捕获特定异常或通用Exception 通过raise主动抛出异常 自定义异常 创建继承Exception的类实现业务特定错误处理

hsjshsft的博客 672

八、错误、调试与测试

1、错误处理 try...except...(finally...):finally可不写,可加‘else’表在没有错误时执行else下的内容 1 try: 2 r = 10 / 0 3 print('result:',r) 4 except ZeroDivisionError as e: 5 print('Error:',e) ...

ak474755的博客 132
上一篇: 【Python入门】17.面向对象编程之 元类metaclass & ORM框架编写
下一篇: 【Python入门】19.调试器pdb、单元测试unittest和文档测试doctest
三贝
博客等级 码龄8年 137粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值