常见异常
在程序运行过程中影响程序正常运行的内容,称为异常.
# NameError
print(a)
# IndexError: 索引错误
li = [1,2,3,4]
print(li[8])
# KeyError
d = dict(a=1, b=2)
print(d['f'])
# ZeroDivisionError: 除0错误
print(10/(2-2))
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def echo(self):
print(self.name, self.age)
# AttributeError: 对象没有该属性
s1 = Student("westos", 10)
# print(s1.scores)
# s1.echo()
# s1.echo1()
# FileNotFoundError
with open('/tmp/passwd9') as f:
print(f.read(5))
try_except语句
python:try….except……finally……
# try:
# print(a)
# # 如果出现NameError时,不报错,只显示except语句里面执行的内容.
# except NameError:
# print("name error")
# print("hello")
# print("hello1 ")
捕获异常
try:
f = open("hello.txt", 'w')
f.write("这是一个测试文件")
# 注意: except语句不一定会执行,只有在try语句中出现IOError报错时,才会执行.
except IOError as e:
print(e)
# print("没有找到文件或者文件读取失败")
# 如果没有捕获到异常,则执行else语句的内容
else:
print("文件内容写入成功")
# 无论是否捕获到异常,都执行的语句.
finally:
f.close()
print("文件已经关闭")
不指定异常类型的except使用
try:
f = open('hello.txt')
# f.write("这是一个测试文件")
f.read()
# 不建议捕获所有的异常, 因能不能定位错误的位置.
except:
print("捕获所有的异常....")
else:
print("如果没有捕获到异常, 执行else语句")
finally:
f.close()
print("有异常或者没有异常都会执行")
捕获多个异常
try:
d = dict(a=1, b=2)
print(d['f']) # KeyError
print(a) # NameError
except KeyError as e:
print(e)
except NameError as e:
print(e)
else:
print("没有产生异常")
finally:
print("无论是否产生异常的清理操作")
print("new start")
try:
d = dict(a=1, b=2)
print(d['f']) # KeyError
print(a) # NameError
except (KeyError, NameError) as e:
print(e)
else:
print("没有产生异常")
finally:
print("无论是否产生异常的清理操作")
print("new start")
抛出异常
raise 抛出异常的名称,抛出异常的详细显示
所有的异常实际上是一个类, 所以异常的父类都是BaseException.
def get_age(age):
if 0 < age <= 200:
print(age)
else:
# 如果raise抛出异常, 程序后面的代码不会再执行.
raise Exception('invaild age')
get_age(1000)
get_age(100)
抛出异常与继承
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
# 抛出异常
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
断言
age = int(input('Age:'))
assert 0 < age < 100, "年龄不合法"
if 1!=1:
raise AssertionError
def is_huiwen_num(num):
snum = str(num)
return snum == snum[::-1]
# 如果希望程序中的所有assert语句不执行, 那么给python -O 脚本名
if __name__ == "__main__":
assert is_huiwen_num(100) == True, "error"
assert is_huiwen_num(101) == True
print("assert")
logging模块
import logging
s = '0'
n = int(s)
# 配置日志的信息:
# 1). 日志级别: debug, info, warning, error, critical
# 2). level: 指日志级别为info及以上的日志信息会被记录到文件中;
# 3). format: 指定日志的格式, 可以去logging.Formatter查看参考信息
logging.basicConfig(filename="hello.log",level=logging.INFO,
format="%(asctime)s - %(filename)s[%(lineno)d] - %(levelname)s: %(message)s")
logging.debug("this is a debug info")
logging.info("this is a info")
logging.warning("这是一条警告信息")
logging.info('n=%d' %n)
print(10/n)
pdb调试
import pdb
def pdb_run(args): # 4
for i in range(args): # [0,1,2,3]
pdb.set_trace()
print(i)
return args # 4
pdb.run("pdb_run(4)")
开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。