文档章节

Python中的异常处理

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:23
字数 1312
阅读 2
收藏 0

当Python程序无法正常处理一个程序时,那么它就会抛出一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时,我们需要捕获并且处理它,否则程序会终止执行。

Python主要支持五种异常机制,接下来具体说明这几种异常机制。


第一种,默认的异常处理器

s = 'Hello World'
print s[123]
print 'not here'

如果我们没有对异常进行任何处理,那么在程序执行的过程中发生异常,系统就会中断程序,并且调用Python默认的异常处理器,并在终端中输出异常信息。如果调用默认的异常处理器,那么发生异常的程序的后续程序都不会被执行,即第三行不会被执行。

# output
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

第二种,try......except....

s = 'hello world'
try:
    print s[123]
except IndexError:
    print 'err...'
print 'here...'

当程序执行到try语句的时候,会进入try语句块执行。如果没有发生异常,那么久执行try语句块中的程序。如果发生异常了,那么就会寻找后面是否有except语句。找到except语句之后,会调用这个自定义的异常处理器。except将异常处理完之后,程序会继续往下执行。也就是说,代码中的两个print都会被执行。

# output
err...
here...

第三种,try......finally....

s = 'hello world'
try:
    print s[12]
finally:
    print 'err...'
print 'here...'

当程序执行到finally语句时,无论异常发生与否,finally中的语句都会被执行。但是,由于没有except处理机制,finally指向完毕后程序会被中断。这种情况下,后续的程序都不会被执行。

# output
err...
Traceback (most recent call last):
  File "jianshu.py", line 6, in <module>
    print s[12]
IndexError: string index out of range

第四种,assert

a = 1
assert a<0, 'the message for error'
print 'here...'

assert也成为断言,这个语句先判断assert后面紧跟的语句是 True 还是 False 。如果是False,则中断程序,调用默认的异常处理器,同事输出assert语句逗号后面的提示信息。在本例子中,程序被中断了,提示了the message for error,后续的程序不会被执行。

Traceback (most recent call last):
  File "jianshu.py", line 5, in <module>
    assert a<0, 'the message for error'
AssertionError: the message for error

第五种,with......as

with open('a.txt', 'r') as f:
    print 2/0
print 'continue...'

我们平时在使用类似文件的流对象时,使用完毕之后要调用close方法进行关闭,这很麻烦。with...as 语句给我们提供了一个非常方便的替代方法:open 打开文件之后将返回的文件流对象赋值给 f,然后再 with 语句块中使用。with 语句块完毕之后,会隐藏地自动关闭文件。如果在 with 语句或者语句块中发生异常,会调用默认的异常处理器进行处理,但文件还是会正常关闭。这种情况下,会抛出异常,最后的print不执行。

# output
Traceback (most recent call last):
  File "jianshu.py", line 5, in <module>
    print 2/0
ZeroDivisionError: integer division or modulo by zero

附:python标准异常
BaseExceptiona:所有异常的基类
SystemExitb python:解释器请求退出
KeyboardInterruptc:用户中断执行(通常是输入^C)
Exceptiond:常规错误的基类
StopIteratione:迭代器没有更多的值
GeneratorExita:生成器(generator)发生异常来通知退出
SystemExith:Python 解释器请求退出
StandardErrorg:所有的内建标准异常的基类
ArithmeticErrord:所有数值计算错误的基类
FloatingPointErrord:浮点计算错误
OverflowError:数值运算超出最大限制
ZeroDivisionError:除(或取模)零 (所有数据类型)
AssertionErrord:断言语句失败
AttributeError:对象没有这个属性
EOFError:没有内建输入,到达EOF 标记
EnvironmentErrord:操作系统错误的基类
IOError:输入/输出操作失败
OSErrord:操作系统错误
WindowsErrorh Windows:系统调用失败
ImportError:导入模块/对象失败
KeyboardInterruptf:用户中断执行(通常是输入^C)
LookupErrord:无效数据查询的基类
IndexError:序列中没有没有此索引(index)
KeyError:映射中没有这个键
MemoryError:内存溢出错误(对于Python 解释器不是致命的)
NameError:未声明/初始化对象 (没有属性)
UnboundLocalErrorh:访问未初始化的本地变量
ReferenceErrore:弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时错误
NotImplementedErrord:尚未实现的方法
SyntaxError:Python 语法错误
IndentationErrorg:缩进错误
TabErrorg:Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError:对类型无效的操作
ValueError:传入无效的参数
UnicodeErrorh:Unicode 相关的错误
UnicodeDecodeErrori:Unicode 解码时的错误
UnicodeEncodeErrori:Unicode 编码时错误
UnicodeTranslateErrorf:Unicode 转换时错误
Warningj:警告的基类
DeprecationWarningj:关于被弃用的特征的警告
FutureWarningi:关于构造将来语义会有改变的警告
OverflowWarningk:旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarningi:关于特性将会被废弃的警告
RuntimeWarningj:可疑的运行时行为(runtime behavior)的警告
SyntaxWarningj:可疑的语法的警告
UserWarningj:用户代码生成的警告

本文转载自:http://www.jianshu.com/p/45a4d4979e6e

AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
好程序员Python分享入门之异常处理机制

好程序员Python分享入门之异常处理机制,异常即是一个事件,该事件会在程序执行过程中发生影响程序的正常执行。python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。今...

好程序员IT
06/19
16
0
Python3.7最新版本使用说明书,请你保管好!

以下是对Python官网内容的翻译 需要注意的是目前这个版本是Python3.7预计发布的四个预览版本之三。 Python Release Python 3.7.0b3 Python数据类 Python生成器异常处理 在Python 3.7中,生成...

糖宝lsh
2018/12/28
34
1
看书 Python 源码分析笔记 (五)

第9章 Python 虚拟机中的一般表达式 这里一般表达式指对象创建语句, 打印语句等. if, while 等归为控制流语句于下一章. 简单内建对象的创建 示例 python 代码: 在 Python 虚拟机执行函数中定...

刘军兴
2015/12/21
112
0
python异常处理

#!/usr/bin/python import traceback try: 1/0 #except Exception,e: # print traceback.format_exc() except Exception as e: print e #!/usr/bin/python import traceback try: 1/0 #excep......

整理秀逗的脑袋
2011/12/29
534
1
[转]optionParser模块的使用方法

Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数; 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成...

阿木阿木
2014/03/08
58
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
58分钟前
11
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.2K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部