【python】-- try except (异常捕获)、断言
try except (异常捕获)
当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的错误,出现这样的错误代表着什么,我们可以提前捕获这些个错误
1、异常处理流程图:
2、常见异常
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
- 导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
更多异常:
- ArithmeticError
- AssertionError
- AttributeError
- BaseException
- BufferError
- BytesWarning
- DeprecationWarning
- EnvironmentError
- EOFError
- Exception
- FloatingPointError
- FutureWarning
- GeneratorExit
- ImportError
- ImportWarning
- IndentationError
- IndexError
- IOError
- KeyboardInterrupt
- KeyError
- LookupError
- MemoryError
- NameError
- NotImplementedError
- OSError
- OverflowError
- PendingDeprecationWarning
- ReferenceError
- RuntimeError
- RuntimeWarning
- StandardError
- StopIteration
- SyntaxError
- SyntaxWarning
- SystemError
- SystemExit
- TabError
- TypeError
- UnboundLocalError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeError
- UnicodeTranslateError
- UnicodeWarning
- UserWarning
- ValueError
- Warning
- ZeroDivisionError
3、处理单个异常
语法如下:
- try:
- code #处理的语句
- except Error1 as e: #遇到Error1执行下面的语句,在python2中写成except Error1,e
- print(e)
代码如下:
- name = [1,2,3]
- try:
- name[3] #不存在3这个下标值
- except IndexError as e: #抓取 IndexError 这个异常
- print(e) #e是错误的详细信息
- #输出
- list index out of range
4、处理多个异常
①写多个except,语法如下:
- try:
- code
- except Error1 as e: #处理Error1异常
- print(e)
- except Error2 as e: #处理Error2异常
- print(e)
代码如下:
- name = [1,2,3]
- data = {"a":"b"}
- try:
- data["c"] #这边已经出现异常KeyError ,所以直接跳出code,跳到KeyError 下去处理
- name[3]
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- #输出
- 'c'
②写1个except,语法如下:
- try:
- code
- except (Error1,Error2,...) as e:
- print(e)
代码如下:
- try:
- data["c"]
- name[3]
- except (IndexError,KeyError) as e:
- print(e)
- #输出
- 'c'
注:第二种写法的用处:括号里面的所有错误,不管出现里面任何一种错误都用统一的处理方法。
5、Exception异常
语法如下:
- try:
- code
- except (Error1,Error2,...) as e:
- print(e)
- except Exception as e: #用Exception表示一下子抓住所有异常,这个一般情况下建议在异常最后面用,用在最后抓未知的异常
- print(e)
代码如下:
- try:
- open("qigao.text","r",encoding="utf-8")
- except (IndexError,KeyError) as e: #没有IndexError,KeyError这两个异常
- print(e)
- except Exception as e: #只能通过这个异常处理,Exception 抓住所有的异常
- print(e)
- #输出
- [Errno 2] No such file or directory: 'qigao.text'
6、else作用
作用:没有异常,则走else部分的逻辑代码
- try:
- print("qigao,handson") #代码没有异常
- except (IndexError,KeyError) as e:
- print(e)
- except Exception as e:
- print(e)
- else: #没有异常出错,走else的逻辑代码
- print("没有异常")
- #输出
- qigao,handson
- 没有异常
7、finnally作用
作用:不管有没有错误,都会执行finnally中的代码
语法如下:
- try:
- code
- except (Error1,Error2,...) as e:
- print(e)
- except Exception as e:
- print(e)
- else:
- print("没有错误,执行")
- finnally:
- print("不管有没有错,都执行finnally")
①没有异常情况
- try:
- print("qigao,handson") #没有异常
- except (IndexError,KeyError) as e:
- print(e)
- except Exception as e:
- print(e)
- else:
- print("没有异常")
- finally:
- print("不管有没有错,都这行finnally")
- #输出
- qigao,handson
- 没有异常
- 不管有没有错,都这行finnally #没有报错,执行finnally
②出现异常情况
- try:
- data = {"a":"b"}
- data["c"] #data字典中没有'c'这个key值
- except (IndexError,KeyError) as e:
- print(e)
- except Exception as e:
- print(e)
- else:
- print("没有异常")
- finally:
- print("不管有没有错,都这行finnally")
- #输出
- 'c'
- 不管有没有错,都这行finnally #出错了也执行了finnally语句
8、自定义异常
- class GaoError(Exception): #定义一个异常类,继承Exception
- def __init__(self,message):
- self.message = message
- def __str__(self):
- return self.message #给对象取一个名
触发自定义异常:
- try:
- raise GaoError("数据库连接不上了") #触发自定义异常,GaoError("数据库连接不上了")这个对象
- except GaoError as e:
- print(e)
- #输出
- 数据库连接不上了
自定义使用总结:
- 数据库连接不上的信息
- 权限问题,解析是没有权限了,给出异常提示
- 业务逻辑的错误
断言
断言被用作你接下来的程序执行,如果后面程序依赖于前面的程序,后面的程序有很重要,就是后面的程序执行肯定不能出错,所以在执行之前要做检查工作。
1、断言assert
- class C(object):
- def __init__(self):
- self.name = "AAAAA"
- c_obj = C()
- assert c_obj.name == "AAAAA" #断言
- print("没有错误继续...")
- #输出
- 没有错误继续..
2、断言不符合
- class C(object):
- def __init__(self):
- self.name = "AAAAA"
- c_obj = C()
- assert c_obj.name == "BBBBB" #断言出字符串不匹配
- print("没有错误继续...")
- #输出
- Traceback (most recent call last):
- File "E:/PycharmProjects/pytest/day7/断言.py", line 10, in <module>
- assert c_obj.name == "BBBBB
- AssertionError #报断言异常错误
3、其实也可以使用if解决这个问题,不过相比之下断言assert更优雅一些,减少代码量
- class C(object):
- def __init__(self):
- self.name = "zhangqigao"
- c_obj = C()
- if c_obj.name == "gaogao":
- print("有错误....")
- else:
- print("没有错误继续...")
【python】-- try except (异常捕获)、断言的更多相关文章
- python中的异常捕获怎么用?
http://www.2cto.com/kf/201301/184121.html http://www.w3cschool.cc/python/python-exceptions.html try: ...
- Python面向对象之异常捕获(一)-----抛出一个异常
大部分的异常都继承自Exception这个类(而这个类有继承自BaseException这个类) 常见的异常 ValueError TypeError IndexError 抛出一个异常 下面这个类的 ...
- python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3
异常捕获 异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 影响:整个程序无法再正常运行 异常的结构 异常的类型 NameError 异常的信息 ...
- try except 异常捕获的方法、断言的使用
except as e中的'e'的作用总结 - 2puT - CSDN博客 Python使用try except处理程序异常的三种常用方法分析 Python3和Python2 异常处理except的不 ...
- Python档案袋(异常与异常捕获 )
无异常捕获 程序遇到异常会中断 print( xxx ) print("---- 完 -----") 得到结果为: 有异常捕获 程序遇到异常会进入异常处理,并继续执行下面程序 tr ...
- python入门19 异常及异常处理 异常捕获
常见异常举例 """ 一些异常举例:""" '''模块不存在 ModuleNotFoundError: No module named 'd ...
- python大法好——异常
---恢复内容开始--- Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Pyth ...
- Python错误和异常 学习笔记
错误和异常概念 错误: 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行 1.程序遇到 ...
- Python错误和异常概念(总)
转载请标明出处: http://www.cnblogs.com/why168888/p/6435956.html 本文出自:[Edwin博客园] Python错误和异常概念(总) 1. 错误和异常的处 ...
随机推荐
- Tomcat 启动或者发布项目时提示Publishing failed:Resource /xxxx does not exist
解决方法: 刷新一下项目,有可能是磁盘文件和Eclipse项目中文件不一致造成的. 重新启动eclipse 删除tomcat server 重新发布下即可
- 黑马程序猿——JAVA高新技术——反射
----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.对于反射的概念 对于JAVA反射机制是在执行状态中,对于随意一个类.都可以知道 ...
- vue笔记二
七.列表渲染 1.示例 <ul id="example-2"> <li v-for="(item, index) in items"> ...
- linger博客原创性博文导航
linger博客原创性博文导航 http://blog.csdn.net/lingerlanlan 大学研究游戏外挂技术開始了此博客.断断续续写了些博文. 后来,開始机器学习和深度学习的研究工作,因为 ...
- 微信java开发之实现微信主动推送消息
1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 public class WeixinAPI ...
- Kafka备忘
官网 http://kafka.apache.org/ 多生产者多消费者 多topic和多分区 多消费者组.每组中消息不能重复消费,组间不影响 启动 RunKafka(){ cd $kafka_hom ...
- Android适配方案小结(二)
该节主要记录从代码中获取与屏幕适配相关的各个參数: Java代码例如以下 public class ScreenUtil { /** * Note: * 仅仅有activity能够使用getWindo ...
- mysql中把字符串转成时间戳进行对比
::") ");
- IntelliJ IDEA 2014 付费版 免费版比较
http://www.jetbrains.com/idea/features/editions_comparison_matrix.html Freemarker, Velocity IDE Feat ...
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> ...