Python异常处理

Python异常处理

日常小笔记

常见异常分类

异常名称 触发条件
AssertionError assert 语句类似于判断语句if, 但是assert语句后面condition为假的时候, 程序将停止并抛出AssertionError异常. assert语句一般是在测试程序的过程中在代码种置入的检查点.
AttributeError 当试图访问的对象属性不存在时抛出的异常
IndexError 在使用序列的时候常常会遇到IndexError异常, 原因是索引超出序列范围的内容.
KeyError 当试图在字典中查找一个不存在的关键字时就会引发KeyError异常,因此建议使用dect.get()方法.
NameError 当尝试访问一个不存在的变量时,Python会抛出一个NameError异常.
OSError 顾名思义是操作系统产生的异常, 像打开一个不存在的文件会引发FileNotFoundError, 而这个FileNotFoundError是OSError的子类
SyntaxError 如果遇到SyntaxError是Python的语法错误,这时Python代码宾不能继续执行,你应该先找到并改正错误.
TypeError 不同类型之间的无效操作, 有些类型不同是不能相互计算的,否则会抛出这个异常. 例如 1 + ‘1’
ZeroDivisionError 除数为0的异常

try-except 语句

和 C/java 一样的 try-catch 一样, Python 提供了try - except 语句

语法

  • 语法举例: FileNotFoundError
try:
f = open('test')
print(f.read())
f.close()
except OSError:
print("Some errors occured while open the file!")
  • 但是我们知道, OSError有很多种, 所以我们可能会更在意错误的具体内容, 这里可以使用as把具体的错误信息给打印出来:
try:
f = open('test')
print(f.read())
f.close()
except OSError as reason: ## except ... as ... 是语法
print("some errors:"+ str(reason))

多个异常

  • 针对性处理: 写多个except 语句
try:
f = open('test')
print(f.read())
f.close()
except OSError as reason:
print("some errors:"+ str(reason))
except TypeError:
print('type error occured!')
  • 统一处理:
try:
f = open('test')
print(f.read())
f.close()
except (OSError, TypeError) as reason:
print("some errors:"+ str(reason))
  • 捕获所有异常
try:
f = open('test')
print(f.read())
f.close()
except :
print("some errors")

try-finally 语句

一句话解释就是, 和java几乎一样.

  • 但是需要注意的是, 使用下面语句会报错:
try:
f = open('test')
print(f.read())
except :
print("some errors")
finally:
f.close()

Traceback (most recent call last):
File "ex.py", line 7, in <module>
f.close()
NameError: name 'f' is not defined
  • 这是因为, 如果test文件不存在, f对应的文件对象根本没有被创建, 所以在finally 中不能 close它. 解决方法如下:
try:
f = open('test')
print(f.read())
except :
print("some errors")
finally:
if 'f' in locals():
f.close()
print("closed")
  • locals() 这个BIF返回当前作用域所有变量的集合, 如果这个变量没有被定义, 就不会执行close();

raise 语句

和学过的throw 作用相同. 主动抛出一个异常,

f = open('test','w')  ## 想象为什么'w'模式
if f not in locals():
raise FileNotFoundError

丰富的else

Python中的else 不仅能和if搭配, 还能和 while/for, 甚至能和try搭配.

要么怎样, 否则怎样

if condition:
###
else:
###

干完了能怎样, 干不完? 哼~

## 得到一个数的最大公约数
def showMaxFactor(num):
count = num // 2 ## // 是取整除, 即返回商的整数部分
while count > 1:
if num % count == 0:
print('%d 最大公约数是 %d'%(num,count))
break;
count -= 1
else:
print('%d 是一个素数!'% num)

没有问题? 好! 那就干吧!

try:
int('abc')
except ValueError as reason:
print(str(reason))
else:
print('没毛病~')

with语句

with语句在某些特定的场合简化了异常处理. 具体解释如下:

  • 使用with语句, 该对象必须实现满足上下文管理协议: 要包含这两个方法的实现.

    __enter__()
    __exit__()
  • 支持上下文管理协议的对象, 也叫上下文管理器. 运行时上下文通过调用 ,一个在语句体执行前运行, 一个在语句体执行后执行.

  • 上下文表达式, 跟随在with语句后的表达式, 该表达式要返回一个上下文管理器对象.
  • 语句体: with语句包裹起来的代码.

with语句的基本语法形式

with context_expression [as target(s)]:
###with-body

一个例子

with open('test') as f:
for each_line in f:
print(each_line)

总结

这家伙很懒, 什么都没有留下.