异常处理

  • 什么是异常

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

错误分为两种

  • 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. Elasticsearch:如何实现对 emoji 表情符号进行搜索

    转摘自:https://elasticstack.blog.csdn.net/article/details/114261636 Elasticsearch 是一个应用非常广泛的搜索引擎.它可以对文字 ...

  2. 索引模板和动态索引模板 (Index Template和Dynamic Template)

    相关阅读 Index Templates https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-templates.h ...

  3. day42-反射01

    Java反射01 1.反射(reflection)机制 1.1反射机制问题 一个需求引出反射 请看下面问题: 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi clas ...

  4. css过渡样式

    transition: 2s;//过渡两秒 用法: .div{ transition: 2s; }

  5. aws-s3-国际global与国内CN的一些说明

    S3云存储国际版最近经常被墙,国内部分地区有时能正常上传下载,有时也会直接报错网络错误等信息, 所以建议S3使用国内AWS的.国内S3与国外S3在使用时需要注意以下几点: 1)URL不通用 国际版的S ...

  6. Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14

    目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...

  7. static 关键字分析

    在java中static 关键字用途很广,可以修饰成员变量 方法 甚至类(静态内部类),这里不分析static 修饰类 static修饰的内容的运行顺序 java的程序执行之前有一个类的加载的过程,在 ...

  8. 我的Vue之旅 09 数据数据库表的存储与获取实现 Mysql + Golang

    第四期 · 将部分数据存储至Mysql,使用axios通过golang搭建的http服务器获取数据. 新建数据库 DROP DATABASE VUE; create database if not e ...

  9. 常用类.String类

    package 常用类.String;import java.util.Arrays;import java.util.Locale;public class demo01 { public stat ...

  10. csp2022第一轮游记

    DAY -7? 学校没买桶装水!我一时半会不去打水,真的渴.果不其然开始咳嗽了.DAY -1 隔壁班同学主动申请停课了,我也跟来复习,这天主要的成果是把选择题错误控制到2-3题,顺便整理了一点笔记. ...