异常处理

  • 什么是异常

    • 异常是程序错误发生的信号。程序一旦出现错误,就会产生一个异常,如果程序中没有处理该异常,该异常就会抛出来,程序的运行也随即终止。

错误分为两种

  • 1、语法错误

  • 2、逻辑错误

如何处理

  • 语法错误:这种错误在程序运行前就必须改正确

  • 逻辑错误:

    • 针对可以控制的逻辑错误,应该直接在代码层面解决

    • 针对不可以控制的逻辑错误,应该采用try...except...:一种异常产生之后的补救措施

可以控制的逻辑错误:

# 如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防
age = input(">>>: ").strip()
if age.isdigit():
age = int(age) if age > 19:
print('too big')
elif age < 19:
print('too small')
else:
print('you got it')
else:
print('必须输入数字')

不可以控制的逻辑错误:

# 如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
# 如何用try...except
"""
print('start...')
try:
被监测的代码块1
被监测的代码块2
被监测的代码块3
被监测的代码块4
被监测的代码块5
except 异常的类型1 as e:
处理异常的代码
except 异常的类型2 as e:
处理异常的代码
except 异常的类型3 as e:
处理异常的代码
except (异常的类型4,异常的类型5,异常的类型6) as e:
处理异常的代码
except Exception: # 万能异常,当上面所有的异常处理都对不上最终运行此异常处理
处理异常的代码
else:
没有发生异常时要执行的代码
finally:
无论异常与否,都会执行该代码,通常用来进行回收资源的操作
print('end...') """ # 案例1
print('start...') try:
print(111)
print(222)
l=[11,22,33]
l[100] # 异常:list index out of range 列表索引超出范围
print(3333)
except IndexError as e: # 捕捉异常匹配成功并打印e,程序不会崩
print(e) print('end...') # 案例2
print('start...') try:
print(111)
print(222)
l=[11,22,33]
l[100]
print(3333)
except KeyError as e: # 异常对不上没有匹配成功,程序就崩了
print(e) print('end...') # 案例3
print('start...') try:
print(111)
print(222)
l=[11,22,33]
l[0]
dic = {'k1':111}
# dic['kkkkk']
print(3333)
except Exception as e: # 万能异常,什么异常都能对上
print(e)
else: # try内代码块没有异常则执行
print('else的代码')
finally: # 无论异常与否,都会执行该模块,通常是进行清理工作
print('====>finally的代码') print('end...') l=[]
l[100]
>>> IndexError: list index out of range # 列表索引超出范围 dic={}
dic["k1"]
>>> KeyError: 'k1' class Foo:
pass
obj = Foo()
obj.x
>>> AttributeError: 'Foo' object has no attribute 'x' # Foo对象没有属性x int("asdb") # 无效的int()的基数为10:'asdb'
>>> ValueError: invalid literal for int() with base 10: 'asdb' 1/0
>>> ZeroDivisionError: division by zero # 零除法错误:被零除法 def func(x):
pass func() # func()缺少1个必需的位置参数:'x'
>>> TypeError: func() missing 1 required positional argument: 'x' x
>>> NameError: name 'x' is not defined # 名字'x'没有定义 print('asdfadf'
>>> SyntaxError: unexpected EOF while parsing # 解析时意外的EOF:语法错误 # 断言:判断条件达到标准,如果不达到标准就抛出异常(测试程序的时候可以用,测试完后应该删掉)
l = [111,222]
if len(l) != 3: # 判断如果l长度不等于3 方式一
raise Exception('必须达到三个值') # Exception: 必须达到三个值 assert len(l) == 3 # 断定l长度等于3 方式二,跟方式一效果一样
print('后续代码。。。') # raise # 主动抛出异常,为别人定规则的时候就可以用到主动抛异常
raise IndexError("索引错误") # IndexError: 索引错误 # 自定义异常
# 自定义一个权限相关的错误,继承一下内置的异常类型(BaseException:基本的异常)
class Permission(BaseException):
def __init__(self,msg): # 自定义的还可以加其他功能
self.msg = msg raise Permission("权限错误") # 自定义异常通常配合raise使用,自己抛出自定义的异常,提示效果更强
# __main__.Permission: 权限错误

异常的种类

  • 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误
# 常见异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

python什么是异常?如何处理异常的更多相关文章

  1. Android(java)学习笔记82:我们到底该如何处理异常?

    我们到底该如何处理异常? 原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个调用者解决这 ...

  2. 【python学习笔记】8.异常

    [python学习笔记]8.异常 raise Exception: 抛出指定异常 try/except: 捕捉异常 except: 第一个参数是需要捕获的异常类型,可以是多个类型组成元组,第二个参数是 ...

  3. 【JVM虚拟机】(9)-- JVM是如何处理异常的

    [JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前 ...

  4. python学习笔记(七)、异常

    在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...

  5. Java如何处理异常方法?

    在Java编程中,如何处理异常方法? 本例展示了如何使用System类的System.err.println()方法处理异常方法. package com.yiibai; public class E ...

  6. Java如何处理异常层次结构?

    在Java编程中,如何处理异常层次结构? 以下是异常层次结构的示例图 - 此示例显示如何通过扩展Exception类来处理异常层次结构. package com.yiibai; class Anima ...

  7. Python基础:内置异常(未完待续)

    本文根据Python 3.6.5的官文Built-in Exceptions编写,不会很详细,仅对Python的内置异常进行简单(重难点)介绍——很多异常都可以从名称判断出其意义,罗列所有的内置异常. ...

  8. “全栈2019”Java异常第二章:如何处理异常?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  9. Python模块、包、异常、文件(案例)

    Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...

随机推荐

  1. 前端三件套 HTML+CSS+JS基础知识内容笔记

    HTML基础 目录 HTML基础 HTML5标签 doctype 标签 html标签 head标签 meta标签 title标签 body标签 文本和超链接标签 标题标签 段落标签 换行标签 水平标签 ...

  2. Pytorch及Yolov5环境配置及踩坑

    Pytorch及Yolov5环境配置及踩坑 1.何为Yolov5 yolo是计算机视觉方面用来进行目标检测的一个十分出名的开源框架,我搜不到官方的对此概括性的定义,但实际上也没什么必要,更重要的是会使 ...

  3. CentOS 7.9 安装 redis-6.2.0

    一.CentOS 7.9 安装 redis-6.2.0 1 下载地址:https://download.redis.io/releases/redis-6.2.0.tar.gz 2 安装gcc来进行编 ...

  4. leetcode刷题记录之25(集合实现)

    题目描述: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原 ...

  5. java集合框架复习----(4)Map、List、set

    文章目录 五.Map集合[重要] 1.hashMap 六.Collections工具类 总结 集合的概念 List集合 set集合: Map集合 Collection 五.Map集合[重要] 特点: ...

  6. JavaScript基础&实战(3)js中的流程控制语句、条件分支语句、for循环、while循环

    文章目录 1.流程控制语句 1.1 代码 1.2 测试结果 2.弹窗提示输入内容 2.1 代码 2.2 测试结果 3.条件分支语句 3.1 代码 3.2 测试结果 4.while和 do...whil ...

  7. 齐博x1 APP要实现直播的关键两步

    大家务必要注意,缺少这两步,你的APP将不能实现直播, 也即点击直播按钮无法启动直播推流

  8. 齐博x1换服务器如何转移网站?

    如果你要把网站从本机传到服务器,又或者要更换服务器,请按下面的操作处理 第一步,必须要在原网站后台备份数据. 第二步,把备份好的网站所有文件,传到新服务器或空间 特别要注意 \cache\ 目录下建议 ...

  9. C# 7.0 添加和增强的功能【基础篇】

    C# 7.0 版是与 Visual Studio 2017 一起发布. 虽然该版本继承和发展了C# 6.0,但不包含编译器即服务. 一.out 变量 以前我们使用out变量必须在使用前进行声明,C# ...

  10. C#中Enum的用法

    1.定义枚举类型 public enum Test { 男 = 0, 女 = 1 } 2.获取枚举值 public void EnumsAction() { var s = Test.男;//男 va ...