python异常捕获
一、异常介绍
异常简介
看如下示例:
print("-----test--1---")
open("123.txt","r")
print("-----test--2---")
说明:
打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)
异常:
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
二、异常捕获案例剖析
捕获异常 try…except…
看如下示例:
try:
print("-----test--1---")
open("123.txt","r")
print("-----test--2---")
except IOError:
pass
说明:
此程序看不到任何错误,因为用except 捕获到了IOError异常,并添加了处理的方法
pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息
把可能出现问题的代码,放在try中
把处理异常的代码,放在except中
except捕获多个异常
try:
print(num)
except IOError:
print("产生错误了")
修改后的
except捕获的错误类型是IOError,而此时程序产生的异常为 NameError ,所以except没有生效
try:
print(num)
except NameError:
print("产生错误了")
实际开发中,捕获多个异常的方式
注意:
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
获取异常的信息描述
捕获所有异常
else
咱们应该对else并不陌生,在if中,它的作用是当条件不满足时执行的实行;同样在try…except…中也是如此,即如果没有捕获到异常,那么就执行else中的事情
try:
num = 100
print(num)
except NameError as errorMsg:
print("产生错误了:%s"%errorMsg)
else:
print("没有捕获到异常")
try…finally…
try…finally…语句用来表达这样的情况:
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
import time
try:
f = open("test.txt")
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
# 如果在读取文件的过程中,产生了异常,那么就会捕获到
# 比如 按下了 Ctrl+c
pass
finally:
f.close()
print("关闭文件")
except:
print("没有这个文件")
try嵌套中的demo:
函数嵌套调用中
三、抛出自定义的异常
你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
下面是一个引发异常的例子:
当程序出错时,python会自动触发异常,也可以通过raise显示引发异常一旦执行了raise语句,raise之后的语句不在执行
如果加入了try,except,那么except里的语句会被执行
四、模块
Python中的模块
有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个
头文件,否则是无法正常进行调用的。
那么在Python中,如果要引用一些其他的函数,该怎么处理呢?
在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要
调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。
说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块
import
在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来
引入。
形如:
import module1,mudule2...
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
在调用math模块中的函数时,必须这样引用:
模块名.函数名
Import math
Print(math.sqrt(4))
import 模块名
有时候我们只需要用到某个模块,此时可以用下面方法实现:
可以导入公共方法,受保护方法和私有方法
有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:
from 模块名 import 函数名1,函数名2…
可以导入公共方法,受保护方法和私有方法
*如果想一次性引入模块中所有的东西,还可以通过from 模块名 import 来实现
总结:from bb import * --此方式只能导入公有的属性、方法、类