Python基础、异常处理
一、概述
错误与异常概念
异常也是对象, 基于Exception类、内置异常
异常处理、流程
- try/except/else 处理python或你触发的异常
- try/fianlly 不管有没有异常,执行清理动作
- raise 手动触发异常
- assert
- 自定义异常类
二、错误与异常的概念
错误: 代码运行前的问题是错误,异常:代码运行后的问题为异常,通常来说错误是指语法错误,代码没有真正的开始执行就已经错误,异常是语法正确但程序的逻辑出现问题导致错误.
Python用异常对象(execption object)来表示异常情况。遇到错误后会引发异常。如果异常对象没有被处理,程序就会回溯(traceback) 终止运行.
语法错误:
>>> Print 'hello' #语法错误 File "<stdin>", line 1 Print 'hello' ^ SyntaxError: invalid syntax
异常1:
>>> int('string') #不能将字符串转换为整型,异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'string'
异常2:
>>> print 1 / 0 #数字0不能做分母,异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero
内建异常:
异常也是一个对象(类), Python中内置了很多的异常 参考: http://python.usyiyi.cn/python_278/library/exceptions.html#bltin-exceptions
也可以通过exceptios模块查看异常的种类
>>> import exceptions >>> dir(exceptions) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', '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', '__doc__', '__name__', '__package__']
内置异常种类
三、异常处理
什么时候需要处理异常:
- 通常是程序可预见性的出现问题,然后捕获异常并进行处理。使用异常主作用是对外隐藏程序的错误、允许程序容错。
- 程序遇到异常的时候如果没有处理则终止执行,有时候遇到一些异常但不是特别重要不能让程序终止执行
异常处理的主要方法:
- try/except/fianlly/else.. 处理python或你触发的异常, 支持嵌套, finally与else不是必须的
- try/fianlly 不管有没有异常,执行清理动作,比如打开文件、数据库连接
- raise 手动触发异常
- assert
- 自定义异常类
异常处理的流程:
- 首先,执行try 子句(try和except关键字之间的语句)。
- 如果未发生任何异常,忽略except子句且try语句执行完毕,如果有else也执行else后面的语句
- 如果在 try 子句执行过程中发生异常,跳过该子句的其余部分。如果异常的类型与except关键字后面的异常名匹配, 则执行 except 子句,然后继续执行try语句之后的代码。
- 如果异常的类型与 except 关键字后面的异常名不匹配,它将被传递给上层的try语句;如果没有找到处理这个异常的代码,它就成为一个未处理异常,程序会终止运行并显示一条如上所示的信息
异常处理1:
try: print 1 / 0 except ZeroDivisionError: print '错误,分母不能为0'
异常处理2:
try: ' except TypeError: print '错误,数字不能和字符串相加'
语法错误不能被异常处理:
try: if 1 == 1 #语法错误不能异常处理,程序终止运行 print True else: print False except SyntaxError: print '语法错误' ----- 结果: C:\Python27\python.exe C:/Users/Administrator_weimin/PycharmProjects/learingpython/ttry.py File "C:/Users/Administrator_weimin/PycharmProjects/learingpython/ttry.py", line 288 if 1 == 1 ^ SyntaxError: invalid syntax
try: Print 1 / 1 #语法错误不能被异常处理,程序终止运行 except Exception as e: print e
except可以接收多个异常,但最多只能有一个异常被处理,依次匹配:
try: print 1 / 0 f = open('myfile') except (IOError,ValueError,ZeroDivisionError): print '错误'
多个except处理异常:
try: print 1 / 0 f = open('myfile') except IOError: print '打开文件错' except ZeroDivisionError: print '错误,数字0不能做分母'
else:
try...except语句有一个可选的else子句,其出现时,必须放在所有 except 子句的后面,只有在try里面的语句无异常才会处理else后面的语句。
通常建议不要把所有的代码写到try中, 因为有可能漏掉异常,( 把可能出现的异常的语句放到try, 其它的代码放到else中 )
try: f = open('password') except IOError: print '打开文件错误' f.close() else: for line in f: print line, f.close()
Exception 可以处理任何的异常
def func1(x,y): try: reslut = x / y except Exception as e: print '错误,分母不能为0' else: print reslut print func1(1,0) print func1(2,2)
尽量不写这样的异常处理代码
try: #语句 except: pass
raise 触发异常
使用raise可以触发异常,但需要指定异常的类型, raise被执行后则后面的语句不会被执行。还用做传递异常
>>> raise NameError('myerror') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: myerror
try: raise NameError('由raise触发的异常') except Exception as e: print e
如果捕获到异常又想重新引发它,这种叫传递异常
try: x = int(raw_input('Please enter the first number: ')) except Exception as e: raise e
try/finally
finally不管是否为异常都会处理,主要是用来做清理的动作
try: f = open('password') for line in f: print line, finally: f.close()
try嵌套
try可以嵌套,不过用的不是很多. 内层try的异常如果不能处理会抛给上层try,如果不能处理则程序异常
try: print 'start' try: print 1 / 0 #内层try异常不能处理则抛给上层try except IOError as e: print e except Exception as e: print e
四、用户自定义异常
程序可以通过创建新的异常类来命名自己的异常, 异常通常应该继承Exception类,直接继承或者间接继承都可以.
class MyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) try: raise MyError('myerror') except MyError as e: print e 'myerror'
raise MyError('myerror') Traceback (most recent call last): File "C:/Users/Administrator_weimin/PycharmProjects/learingpython/ttry.py", line 202, in <module> raise MyError('myerror') __main__.MyError: 'myerror'
五、异常处理练习
让用户输入两个数字x,y 计算 x / y的结果,需要考虑两个异常: 1、如果用户输入的字符串为异常,如果数字但分母为0则异常
while 1: try: x = int(raw_input('Please enter the first number: ')) y = int(raw_input('Please enter the second number: ')) print x / y except ValueError: print '错误,请输入数字,请重试' except ZeroDivisionError: print '错误,分母不能为0' else: break
总结:
- 异常和错误的概念,区别。代码运行前、后
- 语法错误不能被异常处理(代码执行前)
- 异常也是对象, 每种异常是一个类,通常通过Exception基类继承
- 程序可预见性的出现异常就需要对异常处理
- 如何处理异常,try/except/finally/else, 可以嵌套. finally和else不是必须的, 主要搞清楚异常处理的流程就行了
- 最好精确的捕获异常,尽量不要写try/except ..pass的语句
Python基础、异常处理的更多相关文章
- python基础-异常处理
一.错误和异常 程序中难免出现错误,而错误分成两种 1.1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def te ...
- python基础 — 异常处理
什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...
- python基础——异常处理及断言
python常见的异常类型? 异常有很多种类型,常见的由语法错误(SyntaxError).类型错误(TypeError).名字错误(NameError)等等,但我们要知道的是异常本身就是一个类的实例 ...
- python基础——异常处理、递归
异常处理 while True: try: num1 = int(input('num1:')) num2 = int(input('num2:')) result = num1 + num2 exc ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- Python 基础之 异常处理
python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理? 先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...
- Python基础_文件的的处理及异常处理
今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数 open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...
- Python基础学习笔记(十三)异常
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...
- Python基础教程【读书笔记】 - 2016/7/5
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第三波:第8章 异常 [总览]学习如何创建和引发自定义的异常,以及处理异常的各种方法. 为了能够处理异常事件,可以再所 ...
- 第一篇:python基础
python基础 python基础 本节内容 python起源 python的发展史 为什么选择python3 第一个python程序 变量定义 表达式和运算符 用户输入 流程控制 判断 流程控制 ...
随机推荐
- for变量作用域(vc6与vs)
for变量:写在for循环初始语句中的变量.如:for (int i=1,j=2; i<100; i++) vc6的for变量 int i 的作用域: void func(bool condit ...
- 情人节那点事,Power BI告诉你
情人节伴随着元宵节刚刚过去,Power BI团队就送给我们一份大礼,利用来自NRF(national retail foundation)和Bing搜索的数据,在Power BI中帮助我们发现在美国那 ...
- 【leetcode】Excel Sheet Column Title & Excel Sheet Column Number
题目描述: Excel Sheet Column Title Given a positive integer, return its corresponding column title as ap ...
- 自动保存u盘里的文件
set fso=createobject("scripting.filesystemobject")set ws=createobject("wscript.shell& ...
- Java数组技巧攻略
Java数组技巧攻略 0. 声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...
- Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)
在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...
- Bugtags 测试平台(支持ios、android)
官网:https://bugtags.com/ 注意:小米手机 授权 打开漂浮窗 App 集成 Bugtags SDK 后,测试人员就可直接在 App 里所见即所得的提交 Bug; SDK 会自动截屏 ...
- ZeroMQ接口函数之 :zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_z85_decode zmq_z85_decode(3) ØMQ Manual - ØMQ/4.1 ...
- js-倒计时自动隐藏
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- 安装phonegap3.2
安装phonegap3.2,要用node.js,还要安装git