Python学习笔记——错误和异常

news2024/11/17 5:26:44

错误的分类

编写程序过程中遇到的错误都分为两类:语法错误与运行时错误。

语法错误:当代码不符合Python语法规则时, 在解析过程中会报SyntaxError。

运行时错误:即语句或表达式在语法上都是正确的, 但在运行时发生了错误。

当程序发生异常时,默认会终止程序的。可以通过使用捕获异常的方式获取异常名称,并通过代码逻辑让程序继续执行,这种逻辑叫做异常处理。

异常的基本语法

异常语法的定义:

try:
    〈语句〉             #运行别的代码
except  <名字〉:
    〈语句〉
except  <名字〉,〈数据〉:
    〈语句〉                #如果引发了’name’异常, 获得附加的数据
else:
    〈语句〉                #如采没有异常发生, 则执行该分支语句

except关键字还可以同时接收多个异常具体的写法是在except后面加个括号, 将要接收的异常当作参数传入。

try:
    x = int(input('请入一个被除数:'))        #等待输入一个数, 并赋位给x
    print('30除以', x, '等于', 30/x)         #输出30以x
except(ZeroDivisionError,ValueError):        #同时捕获ZeroDivisionError与ValueError异常
    print('输入错误, 重新输入……')
except:                                      #捕获其他异常
    print('其他异常……')
try……except...…语句后面还可以跟else语句。当没有异常发生时, 将执行else语句。else语句是个可选语旬, 必须要放在所有except语句后面。

捕获异常类型:通过except后面跟着Exception as e的语旬, 可得到异常类型e。

输出异常详细信息

捕获异常时, 可以使用sys模块中的exc_info函数, 或使用traceback模块中的相关函数, 来获得更多的异常信息。详细介绍如下:

1、 sys的exc_info函数

模块sys中有两个函数可以返回异常的全部信息:一个是exc_info;另一个是last_traceback。两个函数有相同的用法及功能。

exc_info函数会将当前的异常信息以元组的类型返回。元组内包含3个元素, 分别为type、value和traceback。

  • Type:异常类型的名称, 它是BaseException的子类

  • value:捕获到的异常实例

  • traceback:是一个traceback对象

import sys
try:
    x = int(input('请输入一个被除数:'))
    print('30除以', x, '等于', 30/x)
except:
    print(sys.exc_info())  
#(<class 'ZeroDivisionError' >,  ZeroDivisionError ('division by zero ',) , <traceback
#object at Ox000000000C745748 >)
    print('其他异常……')

输出结果的第2行为异常的全部信息。该信息是一个元组类型。元组的第1个元素是一个ZeroDivisionError类:第2个元素是异常类型ZeroDivisionError类的一个实例;第3个元素为一个traceback对象。

2、 traceback对象的显示

要查看traceback对象的内容, 需要先引入traceback模块, 调用traceback模块中的print_tb方法, 并将sys.exc_info输出的traceback对象传入。print_tb方法专用于显示traceback对象的内容。

import traceback
import sys
try:
    x = int(input('请输入一个被除数:'))
    print('30除以', x, '等于', 30/x)
except:
    traceback.print_tb(sys.exc_info()[2])       #打印traceback对象
    print('其他异常……')
else:
    print("再见")

3、 traceback模块的其它函数

通过traceback模块的载入, 可以更简单地获得更多异常信息显示。比如调用traceback对象的print_exc方法, 可以直接将异常内容打印出来。

在traceback模块中, 还有功能类似的print_exception函数。但是print_exception要传入sys.exc_info()的结果。

# 下面两行代码等价
traceback.print_exc()
traceback.print_exception(*sys.exc_info())

捕获预处理异常

try语句在执行时, 如果出现了一个异常, 该语句的剩余部分将被跳过;如果该异常的类型匹配到了except后面的异常名, 则该except后的语句将被执行。

注意:如果except后面没有跟异常名, 必须放在所有捕获异常的语句之后, 表示它可以匹配任何类型的异常。

try语句的工作原理:

(1)当执行一个try语句后, Python就在当前程序的上下文中做标记。

(2)如果程序出现异常, 系统就会回到标记处。接着执行第一个匹配该异常的except子句。异常处理完毕, 控制流就跳过整个try语句(除非在处理异常时又引发新的异常)。

(3)如果程序出现异常, 但没有找到相匹配的except子句。异常将被递交到上层的try或者程序的最上层(这样将结束程序, 并打印默认的出错信息)。

(4)如果try子句在执行时没有发生异常, Python将执行else的语句(如果有else的话), 然后控制流跳过整个try语句。

常见异常

创建异常

创建异常又叫抛出异常, 也叫作触发异常, 是主动向系统报出异常, 使用关键宇raise来实现。

语法:raise [ Exception [ , args [ , traceback ] ] ]

  • Exception:异常参数值, 指代常的类型(例如, NameError)。该参数是可选的, 默认是None。

  • traceback:是可选的(在实践中很少使用), 代表所要跟踪的异常对象。

注意:raise抛出的异常必须是一个异常实例或类(派生自Exception的类)。

try:
    x = int(input('请输入一个被除数:'))
    if 0 == x:
        raise ValueError('输入错误:不能做被除数')
    print('30除以', x, '等于', 30/x)
except Exception as e:
    print(e)
except ZeroDivisionError:
    print('被除数不等于0, 重新输入......')
except 
    print('其他异常……')

异常的最终处理

Python中, finally语句是与町和except语句配合使用的。

finally语句中的内容般都是用来做清理工作的。无论try中的语句是否跳入except中, 最终都要进入finally语句, 并执行finally语句的分支代码。

finally与else的区别:

  • else语句只在没有异常发生的情况下执行。

  • finally语句则不管异常发生与否都会执行。

finally语句总是在退出try语句前被执行, 无论是正常退出、异常退出, 还是通过break、continue、return语句退出。

断言

断言,使用assert关键宇后面接着一个条件表达式。如果条件表达式为真, 意味着程序当前的条件与开发人员自己断言的情况一致, 则程序继续行;如果为假, 则表明一定是前面发生了错误, 程序停止运行, 报出异常。

Python中, 如果断言后面的条件语句失败了, 还可以为其指定对应的字符串输出。具体做法是:直接在assert后面的条件语句之后, 加上“字符串”

assert 1 != 1,("1不等于1, 报错")     #断言1不等于1

自定义异常

通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承

>>> class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
   
>>> try:
        raise MyError(2*2)
    except MyError as e:
        print('My exception occurred, value:', e.value)
   
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零搭建完整python自动化测试框架(UI自动化和接口自动化

从零搭建完整python自动化测试框架&#xff08;UI自动化和接口自动化&#xff09; 文章目录 总体框架 PO模式、DDT数据驱动、关键字驱动 框架技术选择 框架运行结果 各用例对应的定义方式&#xff08;PO/DDT&#xff09; 测试执行结果 从零开始搭建项目 一、开发环境搭…

Vue-Vuex

前言 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库 官网介绍&#xff1a;https://vuex.vuejs.org/zh/ 以下主要讲解的是如何定义与使用&#xff0c;如果还没有对vuex进行了解的话&#xff0c;请先查看官网&#xff0c;了解其功能、用法及用途。 关于vuex&#xff0c…

代码随想录算法训练营第五十二天_第九章_动态规划 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

LeetCdoe 121. 买卖股票的最佳时机给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可…

verilog 数字系统设计读书笔记-------持久更新

Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型类型共有以下5种&#xff1a;系统级、算法级、RTL级、门级、开关级‘bz :表示高阻态&#xff0c; ’bx表示不定值&#xff08;0或1均可&#xff09;include "muxtwo.v" 将文件引进{$ ra…

【Linux】怎么理解进程

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Liunx系统编程 本文通过冯诺依曼体系结构&#xff08;硬件部分&#xff09;和操作系统&#xff08;软件部分&#xff09;为基础来介绍我们应该如何理解进程&#xff0c;为后续的学习做铺垫。 本文目录一、预备知识1.建…

误差逆传播算法公式理解及推导

前言&#xff1a;公式理解及推导参考自《机器学习》周志华 P101 BP网络 BP网络一般是指由 误差逆传播&#xff08;error BackPropagation, BP&#xff09;算法训练的多层前馈神经网络。 给定训练集 D{(x1,y1)D\left\{\left(\boldsymbol{x}_1, \boldsymbol{y}_1\right)\right…

2023年我的Flag已准备完毕

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a…

用力过猛,把服务压挂了?

背景 在刚开始进行压测的时候&#xff0c;我也不知道需要提前分析下压测的QPS目标&#xff0c;也不知道说第一步压测的预估值是多少&#xff0c;结果一下子干上去&#xff0c;就把测试环境的服务给整挂了&#xff0c;然后就迎来了一大波的投诉&#xff08;好惨呐&#xff09…

【6-循环神经网络】北京大学TensorFlow2.0

课程地址&#xff1a;【北京大学】Tensorflow2.0_哔哩哔哩_bilibiliPython3.7和TensorFlow2.1六讲&#xff1a;神经网络计算&#xff1a;神经网络的计算过程&#xff0c;搭建第一个神经网络模型神经网络优化&#xff1a;神经网络的优化方法&#xff0c;掌握学习率、激活函数、损…

基于微信小程序的校园自助打印系统小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.…

GJB 5000B二级-RDM需求开发与管理

一、主要变化情况 新增3项(金色)、合并12->5项(绿色)、修订3项(蓝色) 合并的主要内容 1、合并过程域:原标准中RD与ReqM合并为RDM   需求开发与需求管理的过程活动紧密相关,在全生命周期中不可分割。 2、合并实践条目:精炼实践,聚焦重点   a)ReqM SP1.1“获…

UE运行时动态设置屏幕分辨率

文章目录 1.实现目标2.实现过程2.1 控制台直接输入命令2.2 通过蓝图设置3.参考资料1.实现目标 在UE中以独立进程(Standalone Game)方式启动游戏,并在运行时动态修改游戏窗口的屏幕分辨率大小,如下图所示屏幕大小从1000x800修改为600x400。 2.实现过程 参考文档和资料,通…

微服务服务治理

服务治理什么是服务治理&#xff1f;第一部分 服务注册第二部分 服务发现Nacos(常见注册中心)入门搭建Nacos环境Nacos远程调用实现商品服务的负载均衡什么是负载均衡&#xff1f;手动实现负载均衡利用组件实现负载均衡修改负载均衡策略什么是服务治理&#xff1f; 服务治理是微…

PySpark sql 中一些函数的总结(持续更新)

看到什么函数就记录了&#xff0c;没有什么逻辑关系 spark 中DataFrame 和 pandas的DataFrame的区别 1. F.split() 和 df.withColumn() from pyspark.sql import SparkSession from pyspark.sql import functions as F from pyspark.sql.types import *df spark.sql(sql) sp…

打开Jupyter notebook没有虚拟环境内核

放了个假&#xff0c;今天准备打开anaconda中的jupyter notebook重温一下之前的文档&#xff0c;结果双击Anaconda-Navigator出现了【应用程序“Anaconda-Navigator”无法打开】&#xff0c;想着利用终端也可以操作&#xff0c;于是使用下面命令激活了环境并打开jupter noteboo…

JZ11 旋转数组的最小数字

【答案解析】&#xff1a;暴力破解&#xff1a;遍历数组找出最小值即可 更优思想&#xff1a;采用二分查找&#xff0c;这个题主要分析三种旋转情况[1, 2, 3, 4, 5]&#xff0c;使用中间值与右端进行比较。 1. 中间大于右边[3, 4, 5, 1, 2]&#xff0c;这种情况下&#xff0c;最…

Spring Framework-01

Spring两大核心技术 1.IOC 2.AOP Spring 1 Spring Framework 1.核心层 Core Container:核心容器&#xff0c;这个模块是Spring最核心的模块&#xff0c;其他的都需要依赖该模块 2.AOP层 AOP:面向切面编程&#xff0c;它依赖核心层容器&#xff0c;目的是在不改变原有代码的前…

国内那么多的低代码平台,究竟哪家比较强?

国内有特色的低代码快速开发平台产品有哪些&#xff1f;这篇就来介绍下目前市面上主要的几家低代码开发平台&#xff01; 简道云、明道云、IVX这几家目前是无代码赛道的明星选手&#xff0c;在市场综合表现上名列前茅。宜创、红圈营销虽也极具潜力&#xff0c;但在市场表现力上…

virsh日常管理命令

virsh日常管理命令virsh日常管理命令创建vm实例规范网卡编号从0开始Centos7最小化安装环境勾选VM实例建议只分配/分区查看vm列表启动vm实例--startvm实例(软)关机--shutdownvm实例断电关机--destroyvm实例(软)重启--rebootvm实例重命名--domrenamevm实例挂起--suspend查看vm实例…

Elasticsearch:从 Kafka 到 Elasticsearch 的实时用户配置文件数据管道

如今&#xff0c;网络服务、数字媒体、传感器日志数据等众多来源产生了大量数据&#xff0c;只有一小部分数据得到妥善管理或利用来创造价值。读取大量数据、处理数据并根据这些数据采取行动比以往任何时候都更具挑战性。 在这篇文章中&#xff0c;我试图展示&#xff1a; 在…