Python基础——异常处理
1.语法错误和异常
语法错误:因为编程经验不足,在程序编写阶段带来的错误,如果不及时纠正,程序无法正常运行。例如:忘记加:,中英文标点混用,缩进对不齐。
异常:语法上没问题,程序能运行,但是可能会有不可预知的情况导致程序崩溃
2.异常处理的基本语法
异常处理的代码是:
try:
里面放上可能会出错的代码段1
except:
针对于所有异常进行的处理 代码2
else:
代码3
finally:
不管出不出错都会执行的代码(可选) 代码4
except 根据需要可以写多个
如果执行结果不出错,代码1--->3--->4
如果出现了异常,代码1不出错的部分---->2---->4
#异常处理基本结构
try:
a=int(input("输入一个数:"))
b=10/a
print(b)
print("try")
except ValueError:
print("输入的值无法转换为整数!")
except ZeroDivisionError:
print("被除数不能为0!")
finally:
print("finally")
执行结果如下:
3.raise语句的用法
可以抛出一个指定的异常,也可以自定义异常
4.异常处理中的else语句
异常处理中的else语句只有在没有发生异常时才会运行
try:
import requests
txt=requests.get("http://www.baidu.com").text
print(txt)
except:
print("网络故障,稍后再试!")
else:
print("网络情况良好!")
执行结果如下:
5.assert语句的用法
#断言语句
try:
a=1
assert a>1,"然而a并不大于1"
print("结束try")
except AssertionError as e:
print(e)
print("程序结束!")
执行结果如下:
调试程序,-O可以忽略断言,关掉断言开关
6.logging模块的用法
低于警告级别(info、debug)就不输出,优点是允许你指定记录信息的级别
#日志模块综合应用
import logging
def output(fname):
"同时输入日志到文件和控制台,级别分开控制"
#输出到文件
logging.basicConfig(level = logging.DEBUG,
format= "%(asctime)s:%(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
filename=fname,
filemode="a")
#控制台输出定义
console = logging.StreamHandler()
console.setLevel(logging.ERROR)
formatter=logging.Formatter("%(asctime)s:%(levelname)s %(message)s")
console.setFormatter(formatter)
#添加一个控制台输出
logging.getLogger().addHandler(console)
#测试
logging.debug("这是一个调试信息!")
logging.info("这是一个通知信息!")
logging.warning("这是一个警告信息!")
logging.error("这是一个错误信息!")
logging.critical("这是一个严重错误信息!")
output("my.log")
执行结果如下:
7.12306网站余票查询过程的分析
(1)输入查询条件:出发站,到达站,出发日期
(2)https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-07-30&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT 把查询条件导入上面网址得到查询网址
(3)使用requests查询,得到一个json文件
(4)从json文件中提取出有效信息
(5)输出结果
#获取火车站信息,根据全拼或汉字站名查询车站代码,加入日志功能
import logging
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
logging.basicConfig(level = logging.DEBUG,
format= "%(asctime)s:%(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
filename="hcp.log",
filemode="a")
logging.info("启动了程序!")
url="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9108"
try: #异常处理
inf=requests.get(url).text
logging.info("更新了车站信息")
except:
print("网络有问题!")
exit()
rlist=inf[:-2].split("@")[1:]
result={}
for i in rlist:
ilist=i.split("|")
code=ilist[2]
cn=ilist[1]
jp=ilist[0]
qp=ilist[3]
result[code]=[cn,jp,qp]
def getid(station):
for k,v in result.items():
if station in v:
return k
from_station=input("出发站:")
to_station=input("到达站:")
from_date=input("出发日期(2019-07-01):")
fid = getid(from_station)
tid = getid(to_station)
qurl=f"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={from_date}&leftTicketDTO.from_station={fid}&leftTicketDTO.to_station={tid}&purpose_codes=ADULT"
rdata=requests.get(qurl,verify=False).json()["data"]["result"]
for i in rdata:
ilist=i.split("|")
checi=ilist[3]
if checi[0] in "GD":
ftime=ilist[8]
ttime=ilist[9]
zuo2=ilist[30]
zuo1=ilist[31]
vip=ilist[32]
print(f"车次:{checi} 发车时间:{ftime} 到达时间:{ttime}")
print(f" 二等座:{zuo2} 一等座:{zuo1} 商务座:{vip}")
执行结果如下:
8.学生信息管理 (含日志和异常处理)
#学生信息管理(字典加密存储版+日志+异常处理)
#学生记录:{学号:[语文分,数学分]}
import shelve
import hashlib
import logging
logging.basicConfig(level = logging.DEBUG,
format= "%(asctime)s:%(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
filename="student.log",
filemode="a")
logging.info("启动了程序!")
username=""
with shelve.open("db") as f:
db=f.get("datas",{"1701":[66,55],"1702":[77,88]})
accounts=f.get("users",{"admin":"e10adc3949ba59abbe56e057f20f883e","guest":"e10adc3949ba59abbe56e057f20f883e"})
logging.info("数据加载完成!")
def update(id):
while 1:
try:
yw=int(input("语文成绩:"))
sx=int(input("数学成绩:"))
assert yw>=0 and yw<=100
assert sx>=0 and sx<=100
break
except:
print("输入成绩格式不对!")
db[id]=[yw,sx]
def idvalid():
while 1:
id=input("学号:")
if id in db:
return id
if id=="":
return
print("输入有误,该学号不存在!")
def add():
while 1:
id=input("学号:")
if id not in db:
break
print("输入有误,该学号已存在!")
if id=="":
return
update(id)
logging.warning(f"{username}追加了学号{id}的记录!")
def delete():
id=idvalid()
if id:
del db[id]
logging.warning(f"{username}删除了学号{id}的记录!")
def change():
id=idvalid()
if id:
update(id)
logging.warning(f"{username}修改了学号{id}的记录!")
def query():
print(db)
id=input("请输入要查的学号:")
if id in db:
print("语文成绩:",db[id][0])
print("数学成绩:",db[id][1])
logging.warning(f"{username}查询了学号{id}的记录!")
else:
print("查无此人!")
print("欢迎使用")
username=input("用户名:")
pwd=input("密码:")
if username=="admin" and hashlib.md5(pwd.encode()).hexdigest()==accounts["admin"]:
logging.info(f"{username}登录了程序!")
while 1:
print("菜单:"
print("1 增 2 删 3 改 4 查 5 退出")
op=input("你的操作是:")
if op=="1":
add()
elif op=="2":
delete()
elif op=="3":
change()
elif op=="4":
query()
else:
exit()
执行结果如下:
9.火车票查询
可以用PrettyTable进行格式上的美化
#获取火车站信息,根据全拼或汉字站名查询车站代码,加入日志功能
import logging
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
logging.basicConfig(level = logging.DEBUG,
format= "%(asctime)s:%(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
filename="hcp.log",
filemode="a")
logging.info("启动了程序!")
url="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9108"
try:
inf=requests.get(url).text
logging.info("更新了车站信息")
except:
print("网络有问题!")
exit()
rlist=inf[:-2].split("@")[1:]
result={}
for i in rlist:
ilist=i.split("|")
code=ilist[2]
cn=ilist[1]
jp=ilist[0]
qp=ilist[3]
result[code]=[cn,jp,qp]
def getid(station):
for k,v in result.items():
if station in v:
return k
from_station=input("出发站:")
to_station=input("到达站:")
from_date=input("出发日期(2019-07-01):")
fid = getid(from_station)
tid = getid(to_station)
qurl=f"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={from_date}&leftTicketDTO.from_station={fid}&leftTicketDTO.to_station={tid}&purpose_codes=ADULT"
rdata=requests.get(qurl,verify=False).json()["data"]["result"]
from prettytable import PrettyTable
x=PrettyTable(["车次","发车时间","到达时间","二等座余量","一等座余量","商务座余量"])
x.align["车次"]
for i in rdata:
ilist=i.split("|")
checi=ilist[3]
if checi[0] in "GD":
ftime=ilist[8]
ttime=ilist[9]
zuo2=ilist[30]
zuo1=ilist[31]
vip=ilist[32]
x.add_row([checi,ftime,ttime,zuo2,zuo1,vip])
print(x)
执行结果如下:
上一篇: 使用C来实现扫雷小游戏
下一篇: Python基础-异常处理
推荐阅读
-
Python基础-异常处理
-
Python基础——异常处理
-
Python 异常处理 与 约束 详解
-
Python异常处理与内置异常(学习笔记)
-
异常处理与调试
-
python 文件追加写入_Python写入文件–解释了打开,读取,追加和其他文件处理功能...
-
Python学习笔记(基础篇)_014_GUI模块 easygui的使用 博客分类: 5.Python学习笔记 pythoneasyguigui
-
Python学习笔记(基础篇)_013_pickle模块 博客分类: 5.Python学习笔记 pythonpickle持久化
-
Python基础编程:利用列表实现简单的先进后出、先进先出
-
Python新手学习基础之条件语句——if/else语句 博客分类: Python python条件语句ifelse