Python——— 异常机制

news2024/11/27 10:46:28

 (一)异常

       工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存在或者文件格式不对;程序在运行着,但是内存或硬盘可能满了等等。

       软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception ,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出,而不至于程序崩溃呢?我们接下来就要讲解这些问题。
         
异常机制本质
当程序出现异常,程序安全的退出、处理完后继续执行的机制
       Python中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次:
        如果我们要拷贝一个文件,在没有异常机制的情况下,我们需要考虑各种异常情况,
这种方式,有两个坏处:①   逻辑代码和错误处理代码放一起! ②  程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!
伪代码如下:
如果是在Python中, Python 的异常机制来处理:
Python 中一切都是对象,异常也采用对象的方式来处理 。处理过程:
   抛出异常: 在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
   捕获异常: 解释器得到该异常后,寻找相应的代码来处理该异常
异常解决的关键:定位
       当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们只需按照从上到下的顺序即可追溯 (Trackback )错误发生的过程,最终定位引起错误的那一行代码。

 (二)异常的解决思路

在日常生活中,我们随时随地都有可能会遇到异常,怎么处理呢?

解决异常问题的态度
  学习完异常相关知识点,只是开始对异常有些认识,不意味着你会调试任何异常;
调试异常,需要大量的经验作为基础。因此,大家不要在此停留,继续往后学习。碰到每个异常,
都要花心思去解决而不要动不动张口问人。通过自己的努力无法解决,再去找老师同学帮助解决。
——遇事不决问度娘,百度有着大多数人遇到的错误,你的错误有可能早已被前人解决。

(三)tryexcept结构

try...一个except结构 

try...except 是最常见的异常处理结构。结构如下:
try :
被监控的可能引发异常的语句块
except   BaseException [ as   e ]:
异常处理语句块
try 块包含着可能引发异常的代码, except 块则用来捕捉和处理发生的异常。
执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;
③执行的时候,如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。

 代码:

try:
    print("step1")
    a = 3/0
    print("step2")
except BaseException as e:
    print("step3")
    print(e)
print("step4")

 

try...多个except结构 

        从日常工作中考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException 。结构如下:
try :
  被监控的、可能引发异常的语句块
except   Exception1 :
处理 Exception1 的语句块
  except   Exception2 :
处理 Exception2 的语句块
[...]
except   BaseException
处理可能遗漏的异常的语句块

实例代码:

try:
    a = input("请输入被除数:")
    b = input("请输入除数:")
    c = float(a)/float(b)
    print(c)

except ZeroDivisionError:
    print("异常:除数不能为0")
except TypeError:
    print("异常:除数和被除数都应该为数值类型")
except BaseException as e:
    print(e)
    print(type(e))

 

try...except...else结构

      try...except...else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。

示例代码:

try:
    a = input("请输入被除数:")
    b = input("请输入除数:")
    c = float(a)/float(b)
    print(c)

except BaseException as e:
    print(e)
else:     
     print("除的结果是:", c)

try...except...finally结构

        try...except...finally 结构中, finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。
实例代码:
try:
    a = input("请输入被除数:")
    b = input("请输入除数:")
    c = float(a)/float(b)
    print(c)

except BaseException as e:
    print(e)
else:
     print("除的结果是:", c)
finally:
    print("我是finally中的语句,无论发生异常与否,都执行!")

print("程序结束!")

return语句和异常处理问题

        由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。
实例代码:
def test01():
    print("step1")
    try:
        x = 3/0   # return "a"
    except:
        print("step2")
        print("异常:0不能做除数")#return "b"
    finally:
        print("step4")
  #return "d"
        print("step5")
    return "e"  #一般不要将return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())

(四)常见的异常

常见异常的解决
Python 中的异常都派生自 BaseException 类,下面列出常见的一些异常,方便初学者掌握。

 

 SyntaxError :语法错误
  int a = 3
        ^
SyntaxError : invalid syntax
NameError :尝试访问一个没有申明的变量 
    print ( a )
NameError : name 'a' is not defined

 

ZeroDivisionError :除数为0错误(零除错误) 
  a = 3 / 0
ZeroDivisionError : division by zero

 

ValueError :数值错误 
  float ( "jihui" )
ValueError : could not convert string to float : 'jihui'
TypeError :类型错误 
    123 + "abc"
TypeError : unsupported operand type ( s ) for + : 'int' and 'str'
KeyError :字典的关键字不存在 
a = { 'name' : "jihui" , 'age' : 18 }
a [ 'salary' ] KeyError : 'salary'
IndexError :索引越界异常  
a = [ 4 , 5 , 6 ]
a [ 10 ]
IndexError : list index out of range

常见异常汇总  

 

 

(六)自定义异常类 

        程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error Exception 为后缀。自定义异常由 raise 语句主动抛出。
        自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即 可。命名一般以 Error Exception 为后缀。 自定义异常由 raise 语句主动抛出。
示范代码:
class AgeError(Exception):  #继承Exception
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo = errorInfo

    def __str__(self):
        return str(self.errorInfo)+",年龄错误!应该在1-150之间"


############测试代码################
if __name__ == "__main__":#如果为True,则模块是作为独立文件运行,可以执行测试代码
    age = int(input("输入一个年龄:"))
    if age<1 or age>150:
        raise AgeError(age)
    else:
        print("正常的年龄:",age)

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

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

相关文章

8、SpringBoot_多环境开发

二、多环境开发 1.概述 概述&#xff1a;开发环境、测试环境、生产环境 分类 开发环境 spring:datasource:druid:url: jdbc:mysql://localhost:3306/springboot_ssmusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver测试环境 spring:datasource:dr…

[WUSTCTF2020]CV Maker 文件头检查

这道很简单 首先注册登入 很显然是我们文件上传 我们直接随便上传一个看看 报错了我们去看看 这个 exif是什么 就是检查文件头 那我们直接修改文件头上传即可 GIF89a <script language"php">eval($_POST[cmd]); </script> 上传修改php即可

全网最全Python系列教程(非常详细)---字符串讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中字符串的讲解&#xff0c;涉及到以下内容&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 本文将从以下几个方面展开对字符串的讲解&#xff1a; 1、字…

如何在Python中实现安全的密码存储与验证

在现代互联网时代&#xff0c;安全性已经成为一个非常重要的问题。在我们的日常生活中&#xff0c;我们会使用许多网站和应用程序&#xff0c;而这些网站和应用程序通常要求我们提供密码来保护我们的个人信息。然而&#xff0c;密码泄露事件时有发生&#xff0c;我们经常听到关…

@ConditionalOnProperty配置属性作为条件

1.ConditionalOnProperty​做什么用的&#xff1f; 主要是根据配置参数&#xff0c;来决定是否需要创建这个bean&#xff0c;这样就给了我们一个根据配置来控制Bean的选择的手段了&#xff0c;不启用只需要更改配置即可。 ​ConditionalOnProperty​源码 package org.springf…

进程管理--CFS调度器(1)

介绍 CFS&#xff08;Completely Fair Scheduler&#xff0c;完全公平调度器)用于Linux系统中普通进程的调度。它给cfs_rq&#xff08;cfs的run queue&#xff09;中的每一个进程设置一个虚拟时钟&#xff0c;vruntime。如果一个进程得以执行&#xff0c;随着时间的增长&#…

Pycharm在进行debug时出现collecting data如何解决?

Pycharm在进行debug时变量界面出现collecting data&#xff0c;问题如下&#xff1a; 解决方法&#xff1a;打开Setting界面&#xff0c;在Python Debugger选项中勾选下图中的Gevent compatible即可。

iOS CocoaPod 打包:SDK开发、Pod组件生成等

参考链接&#xff1a;CocoaPod打包 SDK开发 - 简书 iOS非集成打包&#xff1a;依赖cocoapods的Swift静态库打包、脚本合并真机与模拟器 - 简书 iOS 组件化开发----pod私有库制作及使用_ios组件化开发-CSDN博客 1.生成pod包命令 pod lib create testTools 如果提示&#xf…

img 固定宽高 图像不拉伸 显示图片中间部分

.m-sd-chat-select-avatar-img{width: 100px;height: 125px;object-fit: cover;border-radius: 6px;cursor: pointer;} 使用后&#xff1a; 使用前&#xff1a;

Django 联表查询操作

在日常的开发中&#xff0c;常常需要对多张数据表同时进行数据查询。多表查询需要在数据表之间建立表关系才能够实现。一对多或一对一的表关系是通过外键实现关联的&#xff0c;而多表查询分为正向查询和反向查询。 表模型结构 以歌手表、专辑表、单曲表查询为例子。 歌手与专…

RK3588 VDD_LOGIC电源PCB设计注意事项

RK3588 VDD_LOGIC电源PCB设计 1、VDD_LOGIC的覆铜宽度需满足芯片的电流需求&#xff0c;连接到芯片电源管脚的覆铜足够宽&#xff0c;路径不能被过孔分割太严重&#xff0c;必须计算有效线宽&#xff0c;确认连接到CPU每个电源PIN脚路径都足够。 2、如图1所示&#xff0c;原理…

Scrapy-应对反爬虫机制

参考自https://blog.csdn.net/y472360651/article/details/130002898 记得把BanSpider改成自己的项目名&#xff0c;还有一个细节要改一下&#xff0c;把代码user换成user_agent 禁止Cookie 在Scrapy项目中的settings文件&#xff0c;可以发现文件中有以下代码: COOKIES_ENA…

红黑树-自平衡二叉搜索树

一、简介 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它的节点可以是红色或黑色。这个颜色的设计是为了满足红黑树的五个关键性质&#xff0c;确保树保持平衡和高效地支持插入、删除和搜索操作。 以下是红黑树的五个关键性质&#xf…

【Unity3D日常开发】Unity3D中Quality的设置参考

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 这篇文章就来讲一下Quality的设置&#xff08;Unity版本&#…

浪潮信息被Gartner评为全球文件存储标杆厂商

近日&#xff0c;国际权威研究机构 Gartner 正式发布《2023年存储和数据保护技术成熟度曲线报告》&#xff08;(Hype Cycle for Storage and Data Protection Technologies, 2023&#xff0c;以下简称“报告”&#xff09;&#xff0c;基于对市场应用的前瞻洞察和多年的技术精耕…

518抽奖软件,一键打印中奖名单的方法和用途

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 一键打印中奖名单 主窗口上按 CtrlP 打开 {…

在关系型数据库中储存树形结构

adjacency list 邻接表显然是最简单的方式&#xff0c;也是在实践中经常用到的。其储存节点以及直接父节点来进行储存树形结构 邻接表结构简单&#xff0c;查询修改节点的直接父节点都很容易。然而如果返回父节点下的所有节点之类的跨层操作那就很麻烦了&#xff0c;需要频繁…

matlab实现杨氏双缝干涉实验可视化界面

关于杨氏双缝干涉实验的条纹光强理论推导和matlab绘图可以参考下面的链接&#xff1a;杨氏双缝干涉实验matlab实现 接下来利用GUI实现可视化界面。 一、GUI GUIDE简介 1、在命令行窗口输入小写的guide可以自动弹出fig窗口。 2、界面的左侧是常用的工具&#xff0c;鼠标悬停…

利用串口示波器调试PID参数

PID调试最麻烦的是参数调整&#xff0c;需要花费大量时间&#xff0c;如果每调整一次都要修改代码重新编译烧录&#xff0c;效率很低&#xff0c;推荐串口示波器与rt-thead finsh进行调试 推荐使用FireWater数据引擎 定时上报数据&#xff0c;rt_kprintf不支持浮点数据打印&a…

从零开始之了解电机及其控制(6)六步换向法

引导&#xff1a;六步换向的本质是&#xff1f; 因为无刷电机有三根线&#xff0c;而H桥可以将负载连接到正电压或者地&#xff0c;于是用三对MOS管组成的H桥驱动电机&#xff0c;称为半桥驱动。 无刷电机的优点如下&#xff1a; 首先&#xff0c;由于所有三个电机相位都通过…