捕获异常

python完整的异常处理语法结构如下:

特别说明:

1.try块是必需的,except块和finally,当try块没有出现异常时,程序会执行else块

2.try块后只有一个except快块会被执行,不可能有多个except块被执行。

3.原则:先捕获小异常再捕获大异常

实例:

import sys

try:
a = int(sys.argv[1])
b = int(sys.argv[2])
c = a / b
print("您输入的两个数相除的结果是:",c)
except IndexError:
print("索引错误:运行程序时输入的参数个数不够")
except ValueError:
print("数值错误:程序只能接受整数参数")
except ArithmeticError:
print("算术错误")
except Exception:
print("未知异常") # 输出结果:
E:\myproj\crazy_python\07\7.2>python div_test.py 3 0
算术错误

单异常捕获

import sys

try:
a = int(sys.argv[1])
b = int(sys.argv[2])
c = a / b
print("您输入的两个数相除的结果是:",c)
except (IndexError, ValueError, ArithmeticError):
print("程序发生了数组越界、数字格式异常、算术异常之一")
except:
print("未知异常") # 输出结果
E:\myproj\crazy_python\07\7.2>python multi_exception_test.py 4 0
程序发生了数组越界、数字格式异常、算术异常之一

多异常捕获

def foo():
try:
fis = open("a.txt")
except Exception as e:
print(e)
print(e.args)
print(e.errno)
print(e.strerror) foo() # 输出结果:
[Errno 2] No such file or directory: 'a.txt'
(2, 'No such file or directory')
2
No such file or directory

访问异常信息

4. 1try或except中的return语句,不会影响finally块的执行;但是os._exit()语句会退出python解释器,导致finally块试去执行机会。

import os

def test():
fis = None
try:
fis = open("a.txt")
except OSError as e:
print(e.strerror)
return
os._exit(1)
finally:
if fis is not None:
try:
fis.close()
except OSError as ioe:
print(ioe.strerror)
print("执行finally里的资源回收!") test() # 输出结果:
No such file or directory
执行finally里的资源回收!

finally_1

4.1不能在finally块使用return或raise。finally块中的return或raise语句,会导致try、except块中的return、raise语句失效

def test():
try:
return True # 由于finally中包含return,该return语句失效
finally:
return False a = test()
print(a) # 输出结果
False

finally_2

抛出异常(使用raise引发异常)

不管是系统引发的异常,还是程序员使用raise手动引发的异常,python解释器对异常的处理没有任何差别,都可以使用try...except来捕获它

raise语句有如下三种常用用法:

def main():
try:
mtd(3)
except Exception as e:
print("程序出现异常:", e)
mtd(3) def mtd(a):
if a > 0:
raise ValueError("a的值大于0.不符合要求") main() # 输出结果:
D:\soft\python36\python.exe D:/myproject/crazy_python/07/7.3/raise_test.py
Traceback (most recent call last):
程序出现异常: a的值大于0.不符合要求
File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 17, in <module>
main()
File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 9, in main
mtd(3)
File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 14, in mtd
raise ValueError("a的值大于0.不符合要求")
ValueError: a的值大于0.不符合要求

raise_1

except和raise同时使用

class AuctionException(Exception): pass
class AuctionTest:
def __init__(self, init_price):
self.init_price = init_price
def bid(self, bid_price):
d = 0.0
try:
d = float(bid_price)
except Exception as e:
# 此处只是简单地打印异常信息
print("转换出异常:", e)
# 再次引发自定义异常
# raise AuctionException("竞拍价必须是数值,不能包含其他字符!") # ①
raise AuctionException(e)
if self.init_price > d:
raise AuctionException("竞拍价比起拍价低,不允许竞拍!")
initPrice = d
def main():
at = AuctionTest(20.4)
try:
at.bid("df")
except AuctionException as ae:
# 再次捕获到bid()方法中的异常,并对该异常进行处理
print('main函数捕捉的异常:', ae)
main() # 输出结果:
转换出异常: could not convert string to float: 'df'
main函数捕捉的异常: could not convert string to float: 'df'

except_raise

python学习-异常处理之捕获异常与抛出异常(七)的更多相关文章

  1. python学习-异常处理

    小技巧 isinstance(obj,foo) 检查是否obj是否是类 foo 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) ...

  2. python 学习 异常处理

    异常处理实例 while True: num1 = input('num1:') num2 = input('num2:') try: num1 = int(num1) num2 = int(num2 ...

  3. python学习之路基础篇(第七篇)

    一.模块 configparser configparser用于处理特定格式的文件,其本质是利用open来对文件进行操作 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [ ...

  4. python学习笔记之socket(第七天)

         参考文档:              1.金角大王博客:http://www.cnblogs.com/alex3714/articles/5227251.html               ...

  5. Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性

    新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...

  6. Python学习笔记——基础篇【第七周】———进程、线程、协程篇(socket基础)

    http://www.cnblogs.com/wupeiqi/articles/5040823.htmlhttp://i.cnblogs.com/EditPosts.aspx?postid=55437 ...

  7. Python学习——异常处理

    1.异常基础: 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面 基本语法: try: pass except Exception as e: pri ...

  8. Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 & Socket编程基础)

    FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/ ...

  9. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

随机推荐

  1. Chrome 谷歌浏览器安装使用 Postman 和 Sense 插件

    博客地址:http://www.moonxy.com 一.前言 Google Chrome 的特点是简洁.快速等.Chrome 支持多标签浏览,每个标签页面都在独立的"沙箱"内运行 ...

  2. Spring Boot 入门之 Cache 篇(四)

    博客地址:http://www.moonxy.com 一.前言 Spring Cache 对 Cahce 进行了抽象,提供了 @Cacheable.@CachePut.@CacheEvict 等注解. ...

  3. caffe学习一:ubuntu16.04下跑Faster R-CNN demo (基于caffe). (亲测有效,记录经历两天的吐血经历)

    兜兜转转,兜兜转转; 一次有一次,这次终于把Faster R-CNN 跑通了. 重要提示1:在开始跑Faster R-CNN之前一定要搞清楚用的是Python2 还是Python3. 不然你会无限次陷 ...

  4. NPOI 导出添加批注功能

    这个问题在网上搜,都是说如下即可: //添加批注HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();HSSFComme ...

  5. 1、Spark 2.1 源码编译支持CDH

    目前CDH支持的spark版本都是1.x, 如果想要使用spark 2x的版本, 只能编译spark源码生成支持CDH的版本. 一.准备工作 找一台Linux主机, 由于spark源码编译会下载很多的 ...

  6. [Leetcode] 第289题 生命游戏

    一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初 ...

  7. [C++] C++中的常用库

    转载自:C++常用库 C++ 资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包 ...

  8. BOM之window核心模块

    Window对象包含以下五大核心:document,screen,navigator,history,location. 一     document 文档 document包含了浏览器对标准DOM实 ...

  9. Python将自己写的模块进行打包

    将项目打包成模块的想法来自于flask文档教程,这不是在PyCon上和阿明合了照嘛,这不得多看看人家的东西.有兴趣的可以看看文档的项目可安装化部分,作者将flask项目打包成一个包,使其可以再任何地方 ...

  10. Unity进阶技巧 - RectTransform详解

    前言 最近要做UI,有时候需要在代码中调整改变UI控件的属性,比如位置.大小等,然而在NGUI里面,控制UI控件的位置等属性的是RectTransform这个组件,这个组件继承自Transform组件 ...