Python异常处理机制和常见异常类型_python3 exception 方法属性-程序员宅基地

技术标签: python  后端  Python基础学习  异常处理机制  开发语言  

Python常见异常类型

所报错误 缘由
zeroDivisionError 除(或取模)零(所有数据类型)
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
NameError 未声明初始化对象(没有属性)
SyntaxError python语法错误
ValueError 传入无效参数
OSError 操作系统异常(如:文件打开异常)
keyboardInterrupt 键盘中断错误(如:Ctrl+c使得程序异常退出)
SystemExit 由sys.exit()引发(唯一一个不被认为错误的异常
RuntimeError (运行时错误)程序运行到一半,程序崩溃了
Base Exception(Exception) 所有异常的父类

用try语句捕获异常

1. 完整语法结构

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

2. 注意事项

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

3. 访问异常信息

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

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

raise抛出异常

1. 说明

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

2. 作用

抛出一个错误,让程序进入异常状态。

3. 目的

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

4. 使用语法

①:单独一个 raise
     \quad\;\,\, 在使用 raise 语句时可以不带参数,此时 raise 语句将会自动引发当前上下文激活的异常;否则,通常默认引发 RuntimeError 异常。
     \quad\;\,\, 作用:捕捉到了异常,但是又想重新引发它(传递异常),可以使用不带参数的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 异常类名称
     \quad\;\,\, raise 后带一个异常类名称,表示引发执行类型的异常。

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

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

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 语句时,它会再次引发一次。

自定义异常类型

1. 说明

Python中可以自定义自己的特殊类型异常,只需要从 Exception 基类或 Exception 的子类继承即可(直接或间接)。

2. 完整语法结构

class 类名Error(Exception):
		def __init__(self,参数):
			super().__init__(参数)
			self.数据 = 参数

3. 应用举例

一. 在自定义异常类时基本不需要书写更多的代码,只要指定自定义异常类的父类即可。

class AgeError(ValueError):
    pass


age = int(input('age: '))
if 0 <= age <= 200:
    print(age)
else:
    raise AgeError('age is not correct')
age: 500
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/pythonProject/main.py", line 9, in <module>
    raise AgeError('age is not correct')
__main__.AgeError: age is not correct

二. 封装自定义错误信息

"""
年龄异常(0-200)
"""


class AgeError(Exception):
    # 封装错误信息
    def __init__(self, msg, age_value):
        super().__init__(msg)
        self.msg = msg
        self.age_value = age_value


class People:
    def __init__(self, age):
        self.age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if 0 <= value <= 200:
            self.__age = value
        else:
            raise AgeError("不符合", value)


try:
    p1 = People(250)
    print(p1.age)
except AgeError as e:
    print("错误信息:", e.msg)
    print("输入的年龄是:", e.age_value)
错误信息: 不符合
输入的年龄是: 250

python super()函数
python @property的介绍与使用
python @methodname.setter(文中第四点)

python中,单下划线属性类似于C++中的protected,双下划线类似于C++中的private,但是python中的私有属性仍可以通过_ClassName__FileName这种名字访问到,所以python没有真正意义上的私有。

python异常使用规范

  • 不要过度使用异常
  • 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是以引发异常来代替错误处理。
  • 使用异常处理来代替流程控制。
  • 不要使用过于庞大的 try 块
  • 在 try 块里放置大量的代码,然后紧跟大量的 except 块,增加了编程复杂度。
  • 不要忽略捕获到的异常
  • 处理异常。对异常进行合适的修复,然后绕过异常发生的地方继续运行;或者用别的数据进行计算,以代替期望的方法返回值;或者提示用户重新操作……总之,程序应该尽量修复异常,使程序能恢复运行。
  • 重新引发新异常。把在当前运行环境下能做的事情尽量做完,然后进行异常转译,把异常包装成当前层的异常,重新传给上层调用者。
  • 在合适的层处理异常。如果当前层不清楚如何处理异常,就不要在当前层使用 except 语句来捕获该异常,让上层调用者来负责处理该异常。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_51491920/article/details/123121330

智能推荐

python色卡识别_用Python帮小姐姐选口红,人人都是李佳琦-程序员宅基地

文章浏览阅读502次。原标题:用Python帮小姐姐选口红,人人都是李佳琦 对于李佳琦,想必知道他的女生要远远多于男生,李佳琦最早由于直播向广大的网友们推荐口红,逐渐走红网络,被大家称作“口红一哥”。不可否认的是,李佳琦的直播能力确实很强,他能够抓住绝大多数人的心理,让大家喜欢看他的直播,看他直播推荐的口红适不适合自己,色号适合什么样子的妆容。为了提升效率,让自己的家人或者女友能够快速的挑选出合适自己妆容的口红色号,今..._获取口红品牌 及色号,色值api

linux awk命令NR详解,linux awk命令详解-程序员宅基地

文章浏览阅读3.6k次。简介awk命令的名称是取自三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数据排序,处理数据,生成报表等功能。awk 通常用于文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。awk 通常以文件的一行为处理单位..._linux awk nr

android 网络连接失败!failed to connect to /192.168.1.186(port 8080)_failed to connect to 192.168.88.218:80-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏2次。在网上找了一个小时,一直没有头绪,因为上个星期还是好好的,最后看到一个大神的解答,只需要将防火墙关闭就好了.原本向测试功能的,却卡在了登录上.以此记录.另外好像还有种错误是电脑与手机连接的WiFi不同,也可以看看...._failed to connect to 192.168.88.218:80

matlab 多径衰落,利用MATLAB仿真多径衰落信道.doc-程序员宅基地

文章浏览阅读1.9k次。利用MATLAB仿真多种多径衰落信道摘要:移动信道的多径传播引起的瑞利衰落,时延扩展以及伴随接收过程的多普勒频移使接受信号受到严重的衰落,阴影效应会是接受的的信号过弱而造成通信的中断:在信道中存在噪声和干扰,也会是接收信号失真而造成误码,所以通过仿真找到衰落的原因并采取一些信号处理技术来改善信号接收质量显得很重要,这里利用MATLAB对多径衰落信道的波形做一比较。一,多径衰落信道的特点关于多径衰落..._matlab多径衰落工具箱

python对json的操作及实例解析_import json灰色-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏17次。Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(来自百度百科)python关于json文_import json灰色

mysql实现MHA高可用详细步骤_mysql mha超详细教程-程序员宅基地

文章浏览阅读1.1k次,点赞6次,收藏3次。一、工作原理MHA工作原理总结为以下几条:(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);(2) 识别含有最新更新的 slave ;(3) 应用差异的中继日志(relay log) 到其他 slave ;(4) 应用从 master 保存的二进制日志事件(binlog events);(5) 通过Manager控制器提升一个 slave 为新 m..._mysql mha超详细教程

随便推点

Linux环境下主从搭建心得(高手勿喷)_linux的java主从策略是什么-程序员宅基地

文章浏览阅读194次。一 java环境安装:1 安装JDK 参考链接地址:https://blog.csdn.net/qq_42815754/article/details/82968464注:有网情况下直接 yum 一键安装:yum -y list java(1)首先执行以下命令查看可安装的jdk版本(2)选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令:yum install -y java-1.8.0-openjdk-devel.x86_64(3)安装完之后,查看安装的jdk 版本,输入以下指令_linux的java主从策略是什么

ACM第四题_acm竞赛题 i 'm from mars-程序员宅基地

文章浏览阅读104次。定义int 类型,由while实现A,B的连续输入,输出A+B的值按Ctrl Z结束循环。#include&amp;lt;iostream&amp;gt;using namespace std;int main(){ int A,B; while(cin&amp;gt;&amp;gt;A&amp;gt;&amp;gt;B) { cout&amp;lt;&amp;lt;A+B&amp;lt;&_acm竞赛题 i 'm from mars

TextView.SetLinkMovementMethod后拦截所有点击事件的原因以及解决方法-程序员宅基地

文章浏览阅读5.2k次。在需要给TextView的某句话添加点击事件的时候,我们一般会使用ClickableSpan来进行富文本编辑。与此同时我们还需要配合 textView.setMovementMethod(LinkMovementMethod.getInstance());方法才能使点击处理生效。但与此同时还会有一个问题:如果我们给父布局添加一个点击事件,需要在点击非链接的时候触发(例如RectclerV..._linkmovementmethod

JAVA实现压缩解压文件_java 解压zip-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏31次。JAVA实现压缩解压文件_java 解压zip

JDK8 新特性-Map对key和value分别排序实现_java comparingbykey-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏21次。在Java 8 中使用Stream 例子对一个 Map 进行按照keys或者values排序.1. 快速入门 在java 8中按照此步骤对map进行排序.将 Map 转换为 Stream 对其进行排序 Collect and return a new LinkedHashMap (保持顺序)Map result = map.entrySet().stream() .sort..._java comparingbykey

GDKOI2021普及Day1总结-程序员宅基地

文章浏览阅读497次。第一次参加GDKOI,考完感觉还可以,结果发现还是不行,有一些地方细节打错,有些失分严重,总结出以下几点:1.大模拟一定要注意,细节打挂就是没分,像T1就是一道大模拟题,马上切了,后面就没想着检查以下,导致有些地方挂掉了,用民间数据一测,才85分。2.十年OI一场空,不开longlonglong longlonglong见祖宗。今天的T2本来想用暴力水点分的,结果没想到longlong→intlong long\to intlonglong→int,40→040\to040→0。3.代码实现能力太差,_gdkoi

推荐文章

热门文章

相关标签