python基础教程_学习笔记10:异常
异常
什么是异常
Python用异常对象来表示异常情况。遇到错误后,会引发异常。假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行:
>>> 1/0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
1/0
ZeroDivisionError: integer division or modulo by zero
每一个异常都是一些类的实例,这些实例能够被引发,而且能够用非常多方法进行捕捉,使得程序能够捉住错误并对其进行处理,而不是让整个程序失败。
按自己的方式出错
异常能够在某些东西出错时自己主动引发。
raise语句
为了引发异常,能够使用一个类(应该是Exception的子类)或者实例參数调用raise语句。使用类时,程序会自己主动创建实例。
>>> raise Exception
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise Exception
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
raise Exception('hyperdrive overload')
Exception: hyperdrive overload
第一个样例引发了一个没有不论什么有关错误信息的普通异常;
第二个样例则加入了一些hyperdive overload错误信息。
内建的异常类有非常多。
>>> 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', 'WindowsError', 'ZeroDivisionError', '__doc__', '__name__', '__package__']
全部这些异常都能够用于raise语句:
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
raise ZeroDivisionError
ZeroDivisionError
>>> raise BaseException
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
raise BaseException
BaseException
一些最重要的内建异常类:
类名 | 描写叙述 |
Exception | 全部异常的基类 |
AttributeError | 特性引用或赋值失败时引发 |
IOError | 试图打开不存在的文件(包含其它情况)时引发 |
IndexError | 在使用序列不存在的索引时引发 |
KeyError | 在使用映射中不存在的键时引发 |
NameError | 在找不到名字(变量)时引发 |
SyntaxError | 在代码为错误形式时引发 |
TypeError | 在内建操作或函数应用于错误类型的对象时引发 |
ValueError | 在内建操作或者函数应用于正确类型的对象,但该对象使用不合适的值时引发 |
ZeroDivisionError | 在除法或模除操作的第二个參数为0时引发 |
自己定义异常类
有些时候须要创建自己的异常类。
class SomeCustomException(Exception): pass
能够向自己主动义异常类中添加方法,此处什么也没做。
捕捉异常
关于异常最有意思的地方就是能够处理它们(通常叫做诱捕或者捕捉异常)。
这个功能能够使用try/except来实现。
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
假设用户输入0作为第二个数,则出现ZeroDivisionError异常。
为了捕捉异常而且做出一些错误处理:
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except ZeroDivisionError:
print “The 2nd number can’t be zero!”
看,没參数
>>> class MuffledCalculator:
muffled=False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print "Division by zero is illegal"
else:
raise
>>> calculator=MuffledCalculator()
>>> calculator.calc('10/2')
5
>>> calculator.calc('10/0')
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
calculator.calc('10/0')
File "<pyshell#19>", line 5, in calc
return eval(expr)
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> calculator.muffled=True
>>> calculator.calc('10/0')
Division by zero is illegal
不止一个except子句
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except ZeroDivisionError:
print “The 2nd number can’t be zero!”
假设用户输入“HelloWorld”作为第二个參数,将引发错误:
TypeError: unsupported operand type(s) for /: 'int' and 'str'
由于except子句仅仅寻找ZeroDivisionError异常,这次的错误就溜过了检查并导致程序终止。为了捕捉这个异常,能够直接在同一个try/except语句后面加上还有一个except子句:
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except ZeroDivisionError:
print “The 2nd number can’t be zero!”
except TypeError:
print “That wasn’t a number,was it?”
用一个块捕捉两个异常
假设须要用一个块捕捉多个类型异常,能够将它们作为元组列出:
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except (ZeroDivisionError,TypeError):
print “Your numers are bogus!”
捕捉对象
假设想让程序继续执行,可是又由于某种原因想记录下错误,捕捉对象就非常实用。
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except (ZeroDivisionError,TypeError),e:
print e
真正的全捕捉
就算程序能处理好几种类型的异常,但有些异常还是会从眼皮底下溜走。
以除法为样例,在提示符下直接按回车,不输入不论什么东西,会得倒一个类似以下的错误信息:
SyntaxError: unexpected EOF while parsing
这个异常逃过了try/except语句的检查。这样的情况下,与其用那些并不是捕捉这些异常的try/except语句隐藏异常,还不如让程序立马崩溃。
但假设真的想用一段代码捕获全部异常,能够在except子句中忽略全部的异常类:
try:
x=input(‘1st number: ’)
y=input(‘2nd number: ’)
print x/y
except:
print ‘Something wrong happened...’
警告:像这样捕捉全部异常是危急的,由于它会隐藏全部程序猿未想到而且未做好准备处理的错误。它相同会捕捉用户终止运行的Ctrl+c企图,以及用sys.exit函数终止程序的企图,等等。这时用except Exception,e会更好些,或者对异常对象e进行一些检查。
万事大吉
有些情况下,一些坏事发生时运行一段代码是非常实用的,能够给try/except语句加个else子句:
>>> try:
print 'A simple task'
except:
print 'what?'
else:
print 'nothing'
A simple task
nothing
最后......
finally子句,用来在可能的异常后进行清理。
>>> try:
print 'A simple task'
except:
print 'what?'
else:
print 'nothing'
finally:
print 'clean up'
A simple task
nothing
clean up
异常和函数
异常和函数非常自然地一起工作。假设异常在函数内引发而不被处理,它会传播至函数调用的地方。假设在那里也没有处理异常,它会继续传播,一直到达主程序(全局作用域)。假设那里没有异常处理程序,程序会带着堆栈跟踪终止。
>>> def faulty():
raise Exception('something is wrong')
>>> def ignore_exception():
faulty()
>>> def handle_exception():
try:
faulty()
except:
print 'Exception handled'
>>> ignore_exception()
Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
ignore_exception()
File "<pyshell#51>", line 2, in ignore_exception
faulty()
File "<pyshell#48>", line 2, in faulty
raise Exception('something is wrong')
Exception: something is wrong
>>> handle_exception()
Exception handled
python基础教程_学习笔记10:异常的更多相关文章
- python基础教程_学习笔记14:标准库:一些最爱——re
标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...
- python基础教程_学习笔记12:充电时刻——模块
充电时刻--模块 python的标准安装包含一组模块,称为标准库. 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 不论什 ...
- python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...
- python基础教程_学习笔记1:序列-1
序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素能够是数字或者字符,甚至能够是其它数据结构. python中,最主要的数据结构是序列. 序列中的每一个元素被分配一个序号--即元素的 ...
- python基础教程_学习笔记9:抽象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...
- python基础教程_学习笔记11:魔法方法、属性和迭代器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...
- python基础教程_学习笔记18:标准库:一些最爱——shelve
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...
- python基础课程_学习笔记13:标准库:有些收藏夹——sys
标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...
- python基础课程_学习笔记15:标准库:有些收藏夹——fileinput
标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...
随机推荐
- SMTP命令 发送邮件 DOS命令
1.实例:从qq邮箱 发送到其他地址的邮箱 >telnet smtp.qq.com 25 >helo qq.com >auth login >NzI3MTU0MTg3QHFxL ...
- hdu5336 Walk Out
hdu5336 Walk Out 题意是:入口:地图的左上角,出口,地图的右上角,求所经过的路径的二进制数最小 照着题解敲了一遍 思路是:首先 二进制 的 位数 越小 越好,其次 二进制的前缀零越多 ...
- Android SurfaceView实战 打造抽奖转盘
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...
- 网页内容的html标签补全和过滤的两种方法
网页内容的html标签补全和过滤的两种方法: 假设你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包括进去了,我们能够写个函数方法来补全ht ...
- Qt图片显示效率的比较 转
转http://blog.sina.com.cn/s/blog_5c70dfc80100r257.html 在Qt中处理图片一般都要用到QImage类,但是QImage的对象不能够直接显示出来,要想能 ...
- Codeforces Round #311 (Div. 2)
我仅仅想说还好我没有放弃,还好我坚持下来了. 最终变成蓝名了,或许这对非常多人来说并不算什么.可是对于一个打了这么多场才好不easy加分的人来说,我真的有点激动. 心脏的难受或许有点是由于晚上做题时太 ...
- [欧拉回路+手动开栈] poj 1780 Code
题目链接: http://poj.org/problem? id=1780 Code Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- Android JNI programming demo with Eclipse
用Eclipse 建立 JNI 的專案, 示範怎样在 JAVA 調用 cpp 的函數. 我們將建立一個名稱為 jnidemo的專案, 在主Activity 將調用一個名為libHello.so 的 c ...
- javascript中apply和eval结合的强大用法
eval是一个函数,可以接受一个参数,这个参数可以作为js语句被解释性的执行,利用这个特性,eval和apply结合起来,可以大大简化代码 如下例子 <a class="cl ...
- boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost::crc_32_type crc32; crc32. ...