发生异常与默认的异常处理

  当发生异常的时候,我们代码没有刻意捕获这个异常,所以它会一直向上返回到程序顶层,并启用默认的异常处理器:打印标准出错信息。而且会终止程序。
  执行下面程序

def fun(a,b):
return a[b]
print(fun('nihao',20))

会出现异常,异常信息一般是这样的

Traceback (most recent call last):
File "D:\application\eclipse\workspace\yichang\c1\test1.py", line 8, in <module>
print(fun('nihao',20))
File "D:\application\eclipse\workspace\yichang\c1\test1.py", line 7, in fun
return a[b]
IndexError: string index out of range

捕获异常和异常恢复

  我们希望我们的代码更加的鲁棒,所以,我们希望我们的代码在发生异常的时候依然正常的进行,所以我们要进行异常捕获和处理,使用下面的代码
def fun(a,b):
return a[b]
try:
fun('nihao',20)
except IndexError:
print('nihao')

运行以后的结果是: nihao

  更一般的,我们希望后面的模块,当我们在后面写语句的时候,代码如下
def fun(a,b):
return a[b]
try:
fun('nihao',20)
except IndexError:
print('nihao')
print('dajiahao')

这个时候运行结果如下:

nihao
dajiahao 

说明我们后面的代码能够正常运行。try代码块执行时触发异常,python会自动跳至处理器。处理以后,程序继续向后进行,这样当我们的代码出现异常的时候我们的程序就不会终止了。

引发异常

除了上面程序运行当中出现的异常,我们可以自己引发异常,比如使用raise

try:
raise IndexError
except IndexError:
print('got indexerror')

运行结果如下: got indexerror

除了raise以外,assert可以用来触发异常--它是一个有条件的raise

用户定义异常

我们可以自己定义自己的异常类,通过继承一个内置的异常类,通常为Exception。基于类的异常允许脚本建立异常类型,继承行为以及附加状态信息。 例如,运行下面的代码:

class Bad(Exception):
pass
try:
raise Bad()
except Bad:
print('Bad Exception')

将会得到结果: Bad Exception

终止行为

在try后面除了跟except异常处理器以外,还可以跟finally,与except不同的是,可以定义一定会在执行时收尾的行为,无论try代码块中是否发生异常。

当try代码块中有异常时:

def fun(a,b):
return a[b]
try:
fun('hello',20)
finally:
print('finally excute')
print('fun excute?')

执行的结果如下:

finally excute
Traceback (most recent call last):
File "D:\application\eclipse\workspace\yichang\c1\finally.py", line 9, in <module>
fun('hello',20)
File "D:\application\eclipse\workspace\yichang\c1\finally.py", line 7, in fun
return a[b]
IndexError: string index out of range

可以看到,try中发生异常,最终执行了finally里面的语句,但是try-finally之后的语句是不被执行的,这是因为,异常发生时,控制权在try-finally代码块后中断了。python跳回去执行finally的行为,然后把异常向上传播到前一个处理器(在这个例子中,为顶层的默认处理器)。

当try代码块没有异常的时候:

def fun(a,b):
return a[b]
try:
fun('hello',3)
finally:
print('finally excute')
print('fun excute?')

运行结果如下:

finally excute
fun excute?

可以看到,无论如何finally 里面的代码都会被执行。

python还提供了一种try-finally的一种替代:with-as语句。


总结一下:

  python里面的异常是一种高级控制流设备。可以由python引发,或者自己的程序引发。对于异常来说,可以忽略(以触发默认的出错消息),或者由try语句捕获(由你的代码处理)。try语句有两种逻辑形式,一种是处理异常(except),一种是不管是否发生异常都执行最终的代码块(finally)。python的raise和assert语句根据需要触发异常。with-as是一种替代方式,确保对它所支持的对象执行终结操作。

《python学习手册》第32章 异常基础的更多相关文章

  1. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

  2. Python学习手册(第4版)PDF高清完整版免费下载|百度云盘

    Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...

  3. 《Python学习手册 第五版》 -第16章 函数基础

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  4. 《Python学习手册 第五版》 -第14章 迭代和推导

    承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...

  5. 《Python学习手册 第五版》 -第13章 while循环和for循环

    上一章已经讲过if条件语句,这章重点是循环语句:while.for 本章的重点内容 1.while循环 1)一般形式 2)break.continue.pass和循环的else 2.for循环 1)一 ...

  6. 《Python学习手册 第五版》 -第11章 赋值、表达式和打印

    上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...

  7. 《Python学习手册 第五版》 -第10章 Python语句简介

    前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...

  8. 《Python学习手册 第五版》 -第18章 参数

    在函数的定义和调用中,参数是使用最多喝最频繁的,本章内容就是围绕函数的参数进行讲解 本章重点内容如下: 1.参数的传递 1)不可变得参数传递 2)可变得参数传递 2.参数的匹配模式 1)位置次序:从左 ...

  9. 《Python学习手册 第五版》 -第15章 文档

    本章主要介绍Python中的文档,会通过多种方式来说明,如果查看Python自带文档和其他参考的资料 本章重点内容 1.#注释:源文件文档 2.dir函数:以列表显示对象中可用的属性 3.文档字符串 ...

随机推荐

  1. ssh修改端口号并进行远程访问

    ssh的访问如果都利用22端口,则会容易被攻击,修改一个端口号可增强一定的安全性 1. 修改配置文件sshd_config里端口号 [root@test ~]# vi /etc/ssh/sshd_co ...

  2. [ python ] 练习作业 - 3

    1. 写出Python查找一个变量的顺序 提示:4中作用域的顺序 本地作用域(local) --> 当前作用域被嵌入的本地作用域(enclsing locals) --> 全局/模块作用域 ...

  3. xcode7 安装 KSImageNamed

    1.前往Xcode7的插件文件夹,路径如下: ~/Library/Developer/Xcode/Plug-ins 如果有KSImageNamed,右键删除 2.在终端直接输入命令行: default ...

  4. 洛谷 P2708 硬币翻转 题解

    题目传送门 真如题面所说,难度系数:☆☆☆☆☆(如果你看懂了). 从后往前扫一次,如果a[i]==0&&a[i-1]==1那么将ans+2. 注意最后不要忘记开头if(a[0]=='0 ...

  5. MVC – 5.MVC设计模式和.NetMVC框架

    MVC模式-设计模式 •控制器(Controller)- 负责转发请求,对请求进行处理. •视图 (View) - 界面设计人员进行图形界面设计. •模型 (Model)-业务逻辑.数据.验证规则.数 ...

  6. JS模块化规范AMD之RequireJS

    1.基本操作 加载 JavaScript 文件(入口文件) RequireJS以一个相对于baseUrl的地址来加载所有的代码 <script data-main="scripts/m ...

  7. day1 python简介和入门

    Linux的yum依赖自带Python,为防止错误,此处更新其实就是再安装一个Python: 安装Python 1.下载安装包     https://www.python.org/downloads ...

  8. LR参数组取值操作方法

    LR参数组取值操作方法 奶奶的,每次都要重写一次,粘这里,以后备用.这个使用频率高. Action(){//定义一个变量int rNum; //关联参数组,前提是请求的页面中,存在参数组web_reg ...

  9. bzoj 1224

    dfs + 剪枝, 用最大最小值剪. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...

  10. PHP using mcrypt and store the encrypted in MySQL

    This is how I would do it. Create a class to do encryption/decryption: class cipher { private $secur ...