一、概述

错误与异常概念

异常也是对象, 基于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 子句(tryexcept关键字之间的语句)。
  • 如果未发生任何异常,忽略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基础、异常处理的更多相关文章

  1. python基础-异常处理

    一.错误和异常 程序中难免出现错误,而错误分成两种 1.1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def te ...

  2. python基础 — 异常处理

    什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Pyth ...

  3. python基础——异常处理及断言

    python常见的异常类型? 异常有很多种类型,常见的由语法错误(SyntaxError).类型错误(TypeError).名字错误(NameError)等等,但我们要知道的是异常本身就是一个类的实例 ...

  4. python基础——异常处理、递归

    异常处理 while True: try: num1 = int(input('num1:')) num2 = int(input('num2:')) result = num1 + num2 exc ...

  5. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...

  6. Python 基础之 异常处理

    python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理?  先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...

  7. Python基础_文件的的处理及异常处理

    今天主要讲讲文件读写及异常处理. 一.文件操作 1.1 文件的创建及读 打开文件 open 函数  open(file,[option]) file 是要打开的文件 option是可选择的参数文件的打 ...

  8. Python基础学习笔记(十三)异常

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...

  9. Python基础教程【读书笔记】 - 2016/7/5

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第三波:第8章  异常 [总览]学习如何创建和引发自定义的异常,以及处理异常的各种方法. 为了能够处理异常事件,可以再所 ...

  10. 第一篇:python基础

    python基础   python基础 本节内容 python起源 python的发展史 为什么选择python3 第一个python程序 变量定义 表达式和运算符 用户输入 流程控制 判断 流程控制 ...

随机推荐

  1. 如何持续集成/交付一个开源.NET函数库到Nuget.org

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这是一个简单的入门向导,涉及到GitHub.AppVeyor和Nuget.org. 最 ...

  2. Google赛马问题

    http://coolshell.cn/articles/1202.html 据说,这是Google的面试题.面试题目如下: 一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起 ...

  3. C# RFID windows 服务 网络协议方式

    上篇话说是串口方式操作RFID设备. 下面介绍网络协议方式. 设备支持断线重连. 那我们的服务也不能差了不是. 所以这个服务类也是支持的哦. 不解释上代码: namespace Rfid { /// ...

  4. 三言两语之微信小程序开发初体验(1)

    一.前情   直接切入主题,微信发布了小程序,前端开发者表示,如果不会微信小程序的开发感觉就跟不上时代了,先解答几个容易出现歧义的问题 小程序就叫小程序,不叫应用号,因为apple不准,哈哈 小程序是 ...

  5. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  6. C# 词法分析器(五)转换 DFA

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 在上一篇文章中,已经得到了与正则表达式等价的 NFA ...

  7. 清华学堂 列车调度(Train)

    列车调度(Train) Description Figure 1 shows the structure of a station for train dispatching. Figure 1 In ...

  8. Masonry小结

    一,容易混淆的问题 1.make.left.equal(xxx)的参数若为某个控件,则默认为以该控件的 left 为基准对照. //these two constraints are exactly ...

  9. 如何在VS2012中使用IL Disassembler中查看项目编译生成的程序集

    2016-05-26 11:48:46 测试的WPF项目 MainWindow.xaml代码 MainWindow.xaml.cs 代码 在学习WPF的时候,想验证:删除MainWindow.xaml ...

  10. Browsersync + Gulp.js

    1.安装 Browsersync 和 依赖包 Gulp npm install browser-sync gulp --save-dev 2.gulpfile.js var gulp = requir ...