欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python基础——异常处理

程序员文章站 2024-03-18 12:17:22
...

1.语法错误和异常

语法错误:因为编程经验不足,在程序编写阶段带来的错误,如果不及时纠正,程序无法正常运行。例如:忘记加:,中英文标点混用,缩进对不齐。

Python基础——异常处理

Python基础——异常处理

异常:语法上没问题,程序能运行,但是可能会有不可预知的情况导致程序崩溃

Python基础——异常处理

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")

执行结果如下:

Python基础——异常处理

3.raise语句的用法

可以抛出一个指定的异常,也可以自定义异常

Python基础——异常处理

4.异常处理中的else语句

 异常处理中的else语句只有在没有发生异常时才会运行

try:
    import requests
    txt=requests.get("http://www.baidu.com").text
    print(txt)
except:
    print("网络故障,稍后再试!")
else:
    print("网络情况良好!")

执行结果如下:

Python基础——异常处理

5.assert语句的用法

#断言语句
try:
    a=1
    assert a>1,"然而a并不大于1"
    print("结束try")
except AssertionError as e:
    print(e)
print("程序结束!")

执行结果如下:

Python基础——异常处理

调试程序,-O可以忽略断言,关掉断言开关

6.logging模块的用法

低于警告级别(info、debug)就不输出,优点是允许你指定记录信息的级别

Python基础——异常处理

#日志模块综合应用
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")

执行结果如下:

Python基础——异常处理Python基础——异常处理

Python基础——异常处理

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}")

执行结果如下:

Python基础——异常处理Python基础——异常处理

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()

执行结果如下:

Python基础——异常处理

Python基础——异常处理

Python基础——异常处理

Python基础——异常处理

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)

执行结果如下:

Python基础——异常处理