python之异常机制与常见的异常类型(二)

1、什么是异常?

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

2.python常见异常类型

所报错误缘由
zeroDivisionError除(或取模)零(所有数据类型)
IndexError序列中没有此索引(index)或者下标越界
KeyError映射中没有这个键
NameError未定义的变量
SyntaxErrorpython语法错误
ValueError传入无效参数
OSError操作系统异常(如:文件打开异常)
IOError输入输出异常
FileNotFoundError文件不存在异常
keyboardInterrupt键盘中断错误(如:Ctrl+c使得程序异常退出)
SystemExit由sys.exit()引发(唯一一个不被认为错误的异常)
RuntimeError(运行时错误)程序运行到一半,程序崩溃了
BaseException(Exception)所有异常的父类

3.try…except…else结构

如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except模块
except:捕获所有的异常

不带任何异常类型使用except,如下实例:

try:正常的操作......................
except:发生异常,执行这块代码......................
else:如果没有异常执行这块代码

使用相同的except语句来处理多个异常信息,如下所示:

try:正常的操作......................
except(Exception1[, Exception2[,...ExceptionN]]):发生以上多个异常中的一个,执行这块代码......................
else:如果没有异常执行这块代码

案例:

try:a=int(input('请输入第一个整数:'))b=int(input('请输入第二个整数:'))result=a/b
except BaseException as e:print('出错了',e)
else:print('计算结果为:',result)

4.try…except…else…finally

完整语法结构

try:可能触发异常的语句
except 错误类型1 [as 变量1]:处理语句1
except 错误类型2 [as 变量2]:处理语句2
except Exception  [as 变量3]:不是以上错误类型的处理语句(因为Exception 可接收所有异常)
else:未发生异常执行的语句
finally:无论是否发生异常都执行的语句

finally块无论是否发生异常都会执行,能常用来解释try块中申请的的资源

注意事项
①:as 子句是用于绑定错误对象的变量,可以省略。
②:except子句可以有一个或多个,用来捕获某种类型的错误。多个except结构时,捕获异常顺序按照先子类后父类(从小到大)。为避免遗漏可能出现异常,建议在最后增加BaseException。
③:else子句最多只能有一个。
④:finally子句最多只能有一个。

案例:

try:a=int(input('请输入一个数字:'))b=1/a
except ZeroDivisionError:  #0为分母的异常print('0不能做分母')
except ValueError:  #值异常,比如字母无法转换成int型print('你输入的不是数字')
except:  #捕获上面未捕获到的其他异常print('程序有错误')
else:  #如果程序正常运行完毕,没有保存,则执行else的语句print('程序未出现错误')
finally:  #无论程序是否出现异常,都会执行print('程序全部执行完毕')

访问异常信息
如果程序需要在 except 块中访问异常对象的相关信息,则可通过为异常对象声明变量来实现。
所有的异常对象都包含了如下几个常用属性和方法:
args:该属性返回异常的错误编号和描述字符串。
errno:该属性返回异常的错误编号。
strerror:该属性返回异常的描述宇符串。
with_traceback():通过该方法可处理异常的传播轨迹信息。

try:text = open("a.txt")
except Exception as e:# 访问异常的错误编号和详细信息print(e.args)# 访问异常的错误编号print(e.errno)# 访问异常的详细信息print(e.strerror)

5.raise抛出异常


(1)说明
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

(2)作用
抛出一个错误,让程序进入异常状态。

(3)目的
在程序调用层数较深时,向主调函数传递错误信息要层层 return 比较麻烦,所以人为抛出异常,可以直接向外传递错误信息。

(4) 使用语法
①单独一个 raise
        在使用 raise 语句时可以不带参数,此时 raise 语句将会自动引发当前上下文激活的异常;否则,通常默认引发 RuntimeError 异常。
         作用:捕捉到了异常,但是又想重新引发它(传递异常),可以使用不带参数的raise语句。

raise
Traceback (most recent call last):File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in <module>raise
RuntimeError: No active exception to reraise

②:raise 异常类名称
        raise 后带一个异常类名称,表示引发执行类型的异常。

 raise ZeroDivisionError
Traceback (most recent call last):File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in <module>raise ZeroDivisionError
ZeroDivisionError

③:raise 异常类名称(描述信息)
         在引发指定类型的异常的同时,附带异常的描述信息。

raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 1, in <module>raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零

(5)应用举例

一. 我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。

try:num = input("输入一个数:")# 判断用户输入的是否为数字if not num.isdigit():raise ValueError("输入必须是数字")
except ValueError as e:print("引发异常:", repr(e))
输入一个数:three
引发异常: ValueError('输入必须是数字')

在该例程中,当输入的不是数字时,程序会进入 if 结构,并执行 raise 引发ValueError 异常。虽然在程序中使用 raise 语句引发了异常,但是由于位于 try 块中,抛出异常会被 try 捕获,并由 except 块进行处理。因此程序可以正常执行,并不会导致程序崩溃。
Python repr()函数
二. 在使用 raise 语句时可以不带参数

try:num = input("输入一个数:")# 判断用户输入的是否为数字if not num.isdigit():raise ValueError("输入必须是数字")
except ValueError as e:print("引发异常:", repr(e))raise
输入一个数:three
引发异常: ValueError('输入必须是数字')
Traceback (most recent call last):File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 5, in <module>raise ValueError("输入必须是数字")
ValueError: 输入必须是数字

重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。

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

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

相关文章

Android 的整体架构

Android 的整体架构由多个层次组成&#xff0c;每个层次负责不同的功能。以下是 Android 的整体架构&#xff1a; 应用层 (Applications) 用户直接与应用层交互。这一层包括所有安装的应用程序&#xff0c;例如电话、短信、电子邮件、浏览器等。 应用框架层 (Application Fram…

FullCalendar日历组件集成实战(15)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

leetcode-05-[242]有效的字母异位词[349]两个数组的交集[202]快乐数[1]两数之和

重点&#xff1a; 哈希表&#xff1a;当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。 常用数据结构&#xff1a; List 数组 固定大小 如26个字母&#xff0c;10个数字 空间换时间 Set hashset 去重 Map hashmap <K,V>形式 …

java+vue3+el-tree实现树形结构操作

基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下&#xff0c;业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…

C++ UML建模

starUML UML图转C代码 数据流图 E-R图 流程图 整体架构图 ORM关系图 参考 app.asar附件资源可免激活 JHBlog/设计模式/设计模式/1、StarUML使用简明教程.md at master SunshineBrother/JHBlog GitHub C程序员UML实务手册代码 - 开发实例、源码下载 - 好例子网 GitHub -…

leetcode-09-[232]用栈实现队列[225]用队列实现栈[20]有效的括号[1047]删除字符串中的所有相邻重复项

重点&#xff1a; 栈和队列 Java中 栈不建议用stack来实现 建议用 ArrayDeque和Linkedlist来实现 队列建议用ArrayDeque和Linkedlist来实现 两者效率比较&#xff1a; java - Why is ArrayDeque better than LinkedList - Stack Overflow 基于Linkedlist是链表等&#xff0c;除…

LVGL:

LVGL&#xff08;little video graphics library&#xff09;是一个开源的嵌入式图形库&#xff0c;提供高性能、低资源占用的图形用户界面&#xff08;GUI&#xff09;。具有模块化&#xff08;项目工程源码&#xff09;设计&#xff0c;可以在多平台使用&#xff08;如微处理…

字符串数组——传递文本的不同方法实例

一、实例化一个文本并在文本上直接显示接收的信息 1、制作一个预制体 (1) UI-Text (TMP)&#xff0c;TitleText (2) 给Text (TMP)添加Recipients.cs组件 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine;public class Recipi…

SQL AND OR 运算符的使用与区别

SQL AND & OR 运算符的使用与区别 SQL(Structured Query Language)是一种用于管理关系数据库的编程语言。在SQL中,AND和OR运算符用于在WHERE子句中组合条件,以便更精确地筛选数据。本文将详细介绍SQL中的AND和OR运算符,包括它们的使用方法和区别。 1. SQL AND 运算符…

Linux 常用命令合集

进入root模式 su -> 回车 -> 输入root用户密码关闭系统 方法1&#xff1a; shutdown -h now 方法2&#xff1a; init 0 方法3&#xff1a; telinit 0按预定时间关闭系统 shutdown -h hours:minutes &取消按预定时间关闭系统 shutdown -c重启 shutdown -r now重启…

【技术】MySQL 8.4 免安装版配置

MySQL 8.4 免安装版配置 官网下载压缩包解压文件创建配置文件初始化数据库安装MySQL服务链接数据库修改密码 官网下载压缩包 从MySQL官网下载压缩包&#xff0c;官网&#xff1a;https://www.mysql.com/ 头部菜单点击【DOWNLOADS】&#xff0c;跳转到下载页面。在页面底部点击…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时&#xff0c;通常会面临两个选择&#xff1a;安装双系统或使用虚拟机。两种方式各有优缺点&#xff0c;适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别&#xff0c;帮助用户选择最适合自己的方案。…

【嵌入式 - 关于MCU的内存分配】

一、MCU内存分配 MCU&#xff08;微控制器&#xff09;的内存分配是指如何在不同的内存区域&#xff08;如程序存储器、数据存储器、堆栈等&#xff09;中分配和管理内存。不同的MCU可能有不同的内存架构&#xff0c;但通常MCU的内存通常包括以下几部分&#xff1a; 1.1 内存…

高清无字幕视频素材去哪里找?这几个热门无字幕素材网站你要知道

在短视频创作过程中&#xff0c;高清无字幕的视频素材是提升视频质量的关键。无论是制作校园活动宣传片&#xff0c;还是情感励志视频&#xff0c;这些素材都能让你的视频更具吸引力。今天&#xff0c;我就来给大家推荐几个超棒的视频素材网站&#xff0c;这些网站不仅资源丰富…

Java——面向对象进阶(三)

前言&#xff1a; 抽象类&#xff0c;接口&#xff0c;内部类 文章目录 一、抽象类1.1 抽象方法1.2 抽象类1.3 抽象类的使用 二、 接口2.1 接口的定义和实现2.2 default 关键字2.3 实现接口时遇到的问题 三、内部类3.1 成员内部类3.2 静态内部类3.3 成员内部类3.4 匿名内部类&a…

sslyze一键检查服务器检查服务器的 SSL/TLS 安全性(KALI工具系列二十五)

目录 1、KALI LINUX 简介 2、sslyze工具简介 3、信息收集 3.1 目标主机IP&#xff08;服务器&#xff09; 3.2 KALI的IP 4、操作示例 4.1 扫描主机和端口 4.2 批量扫描 4.3 插件扫描 4.4 输出结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、多才多艺…

C++设计模式---代理模式

1、介绍 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代理或占位符&#xff0c;以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用&#xff0c;可以隐藏目标对象的实现细节&#xff0c;增加额外的…

[Python学习篇] Python字符串

字符串是 Python 中最常用的数据类型&#xff0c;一般使用单引号或引号来创建字符串 语法&#xff1a; 字符串变量名A 字符串变量值A 字符串变量名B "字符串变量值B" 示例&#xff1a; a Hello A print(a) b "Hello B" print(b) 字符串特征 一对引号字…

竟然与 package-lock.json 更新有关!部分用户 H5 页面白屏问题!

一.问题 1 场景 现象 接到部分用户反馈进入xxx H5 页面空白&#xff1b; 研发测日志里问题用户的线上页面URL地址可以正常访问&#xff0c;没有复现问题&#xff01;&#xff01;&#xff01; 定位问题 监控平台和客户端日志报错&#xff1a; SyntaxError: Unexpected toke…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后&#xff0c;实在是太香了&#xff0c;非常符合我这从XAML走过来的老程序员的手感&#xff0c;所以老想着在Blazor项目中引入。看了几个老外大佬的视频&#xff0c;调试了一下午&#xff0c;终于是捣鼓成功了。由于咱们Blazor项目不在node…