python什么是异常?如何处理异常
异常处理
什么是异常
异常是程序错误发生的信号。程序一旦出现错误,就会产生一个异常,如果程序中没有处理该异常,该异常就会抛出来,程序的运行也随即终止。
错误分为两种
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什么是异常?如何处理异常的更多相关文章
- Android(java)学习笔记82:我们到底该如何处理异常?
我们到底该如何处理异常? 原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个调用者解决这 ...
- 【python学习笔记】8.异常
[python学习笔记]8.异常 raise Exception: 抛出指定异常 try/except: 捕捉异常 except: 第一个参数是需要捕获的异常类型,可以是多个类型组成元组,第二个参数是 ...
- 【JVM虚拟机】(9)-- JVM是如何处理异常的
[JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前 ...
- python学习笔记(七)、异常
在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...
- Java如何处理异常方法?
在Java编程中,如何处理异常方法? 本例展示了如何使用System类的System.err.println()方法处理异常方法. package com.yiibai; public class E ...
- Java如何处理异常层次结构?
在Java编程中,如何处理异常层次结构? 以下是异常层次结构的示例图 - 此示例显示如何通过扩展Exception类来处理异常层次结构. package com.yiibai; class Anima ...
- Python基础:内置异常(未完待续)
本文根据Python 3.6.5的官文Built-in Exceptions编写,不会很详细,仅对Python的内置异常进行简单(重难点)介绍——很多异常都可以从名称判断出其意义,罗列所有的内置异常. ...
- “全栈2019”Java异常第二章:如何处理异常?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- Python模块、包、异常、文件(案例)
Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...
随机推荐
- tcp_tw_recycle参数引发的系统问题
文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707
- css事件穿透
代码: pointer-events: none; 解义:你可以看的到第一个元素,但是你看不到下面的元素着,点击第一个元素会穿透触发到第二个元素的元素
- Java Style的C++容器流式处理类
很久没有上博客园了,最近一段时间,因为工作的关系时间上比较闲,利用闲暇时间重新翻了一下丢弃很久的C++语言.C++从98.11.14.17目前已经也走到了20版本,发生了很多变化,也引入了很多新的语言 ...
- 分布式存储系统之Ceph集群启用Dashboard及使用Prometheus监控Ceph
前文我们了解了Ceph之上的RadosGW基础使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16768998.html:今天我们来聊一聊Ceph启 ...
- JVM中的方法区
JVM中的方法区 方法区存储什么? 用于存储已被虚拟机加载的类型信息.常量.静态变量.即时编译器编译后的代码缓存 1.类型信息 对每个加载的类型(类class.接口interface.枚举.注解)jv ...
- 怎样在vue中隐藏el-form-item中的值、设置输入框的值是只读
1.如何在前端vue中隐藏某一个元素(el-form-item怎样隐藏) 给每项表单项添加一个自己的id名,并用v-model绑定相对应的数据,利用v-if根据上一个表单项的数据值来进行显示或隐藏 & ...
- go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪
0.转载 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...
- 狂神说mysql笔记
1.mysql 基本操作 Windows-->Mysql5.7打开 输入用户名和密码 查看数据库 :show databases:查询所有数据库,记住一定要加分号结尾 这里必须全部为 英文空格 ...
- c语言求输入的任一整数的各位数之和
c语言求解代码: # include<stdio.h> int main(void){ int a,i=0,sum=0; scanf("%d",&a); if( ...
- 解决 net core 3.x 跨域问题
跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 以下几种情况是造成跨域的原因: 域名相同,端口不同 域名相同,协议不同(即,一个 ...