十、异常处理&内置模块(一)

本文介绍了Python中的异常处理机制及常用异常类型,并通过示例程序详细展示了异常处理的方法。此外,还深入探讨了Python中date和datetime模块的使用方法,包括日期时间对象的创建、格式化以及时区处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常处理

python 用 异常对象(exception object)来表示异常情况。异常对象可以被处理、捕获,避免程序终止执行。
在编程过程中为了增加友好性,在程序出现Bug时一般不会直接将错误信息展示给用户,而是提供一个友好的输出提示。

常见的异常类型

  • 示例程序1:
Exception   所有异常的基类

AttributeError  特征引用或者赋值失败时引发的

IOError 试图打在不存在的文件(包括其他情况)

IndexError  使用序列中不存在的索引

KeyError    使用映射中不存在的键

NameError   找不到名字(变量)

SyntaxError 在代码为错误形式时引发

SystemExit  系统异常退出

TypeError   在内建操作或者函数应用与错误类型的对象时

ValueError  正确的类型对象,但是对象使用不合适的值

ZeroDivisionError   除法,第二参数为0
  • 示例程序1:
#!/usr/bin/python
# -*- coding:utf-8 -*-
try:
    msg = input(">>")
    int(msg)
except Exception as e:
    print("异常的类型是:%s"%type(e))
    print("异常对象的内容是:%s"%e)

运行结果:

>>python
异常的类型是:<class 'ValueError'>
异常对象的内容是:invalid literal for int() with base 10: 'python'

Process finished with exit code 0
  • 示例程序2:
#!/usr/bin/python
# -*- coding:utf-8 -*-


try:
    1 + "python"
except Exception as e:
    print("异常的类型是:%s"%type(e))
    print("异常对象的内容是:%s"%e)
运行结果:

异常的类型是:<class 'TypeError'>
异常对象的内容是:unsupported operand type(s) for +: 'int' and 'str'

Process finished with exit code 0

Python3 要求我们的异常必须继承 Exception 类。Built-in 的所有异常也都是继承自这个类。因此,我们只需要捕获这个类的实例,就可以捕获所有的异常。

异常处理机制

在Python当中,若一个程序在运行的时候出错,Python解释器会自动的在出错的地方生成一个异常对象,而后Python解释器会自动的在出错地方的附近寻找有没有对这个异常对象处理的代码,所谓异常处理代码就是try……except语句,如果没有,Python解释器会自动的将这个异常对象抛给其调用函数,就这样层层抛出,如果在main当中也没有对这个异常对象处理的代码,Python解释器(实际上是操作系统)最后会做一个简单粗暴的处理,将整个程序给终止掉,并将错误的信息在显示屏上输出。

异常处理方法

  • 基本形式
try:
    可能出现异常的代码块
except Exception as e:
    print("异常的类型是:%s"%type(e))
    print("异常的内容是:%s"%e)
else:
    print('如果代码块不抛出异常会执行此行代码!')
finally:
    print('不管代码块是否抛出异常都会执行此行代码!')
  • 示例程序1:
#!/usr/bin/python
# -*- coding:utf-8 -*-

try:
    msg = input(">>")
    print(int(msg))
except Exception as e:
    print("异常的类型是:%s"%type(e))
    print("异常的内容是:%s"%e)
else:
    print('如果代码块不抛出异常会执行此行代码!')
finally:
    print('不管代码块是否抛出异常都会执行此行代码!')
运行结果:

>>34
34
如果代码块不抛出异常会执行此行代码!
不管代码块是否抛出异常都会执行此行代码!
1

异常使用场景

  1. 异常并不一定使程序的逻辑更加清晰,有的时候会导致程序的逻辑更加混乱,常用于服务器端无法预知客户端的错误场景
  2. 能用if就用if吧
    • 代码示例:
#!/usr/bin/python
# -*- coding:utf-8 -*-


msg = input(">>")
if msg.isdecimal():
    print(int(msg))
else:
    print("您输入的内容有误,请输入数字!")

模块

代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个
.py 文件组成的代码集合就称为模块。如:os 是系统相关的模块;file是文件操作相关的模块

模块分为三种:

  1. 自定义模块
  2. 内置标准模块(又称标准库)
  3. 开源模块

date模块

  • time模块中时间表现的格式主要有三种:

    1. timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

    2. struct_time时间元组,共有九个元素组。

    3. format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。

  • 时间格式转换图
    这里写图片描述

    • 主要time生成方法和time格式转换方法实例:
import time

# 生成timestamp
time.time()
# 1477471508.05
#struct_time to timestamp
time.mktime(time.localtime())
#生成struct_time
# timestamp to struct_time 本地时间
time.localtime()
time.localtime(time.time())
# time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=16, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0)

# timestamp to struct_time 格林威治时间
time.gmtime()
time.gmtime(time.time())
# time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=8, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0)

#format_time to struct_time
time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
# time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)

#生成format_time
#struct_time to format_time
time.strftime("%Y-%m-%d %X")
time.strftime("%Y-%m-%d %X",time.localtime())
# 2016-10-26 16:48:41


#生成固定格式的时间表示格式
time.asctime(time.localtime())
time.ctime(time.time())
# Wed Oct 26 16:45:08 2016
  • struct_time元组元素结构
属性
tm_year(年)比如2011
tm_mon(月)1 - 12
tm_mday(日)1 - 31
tm_hour(时)0 - 23
tm_min(分)0 - 59
tm_sec(秒)0 - 61
tm_wday(weekday)0 - 6(0表示周日)
tm_yday(一年中的第几天)1 - 366
tm_isdst(是否是夏令时)默认为-1

- format time结构化表示

格式含义
%a本地(locale)简化星期名称
%A本地完整星期名称
%b本地简化月份名称
%B本地完整月份名称
%c本地相应的日期和时间表示
%d一个月中的第几天(01 - 31)
%H一天中的第几个小时(24小时制,00 - 23)
%I第几个小时(12小时制,01 - 12)
%j一年中的第几天(001 - 366)
%m月份(01 - 12)
%M分钟数(00 - 59)
%p本地am或者pm的相应符
%S秒(01 - 61)
%U一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w一个星期中的第几天(0 - 6,0是星期天)
%W和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x本地相应日期
%X本地相应时间
%y去掉世纪的年份(00 - 99)
%Y完整的年份
%Z时区的名字(如果不存在为空字符)
%%‘%’字符

常见结构化时间组合

print time.strftime("%Y-%m-%d %X")
#2016-10-26 20:50:13
  • time加减
#timestamp加减单位以秒为单位
import time
t1 = time.time()
t2=t1+10

print time.ctime(t1)#Wed Oct 26 21:15:30 2016
print time.ctime(t2)#Wed Oct 26 21:15:40 2016

datetime模块

datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo。

date类

datetime.date(year, month, day)
  • 静态方法和字段
date.maxdate.mindate对象所能表示的最大、最小日期;
date.resolution:date对象表示日期的最小单位。这里是天。
date.today():返回一个表示当前本地日期的date对象;
date.fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象;
 output
  • 方法和属性
d1 = date(2011,06,03)#date对象
d1.yeardate.monthdate.day:年、月、日;
d1.replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
d1.timetuple():返回日期对应的time.struct_time对象;
d1.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
d1.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
d1.isocalendar():返回格式如(yearmonthday)的元组;
d1.isoformat():返回格式如'YYYY-MM-DD’的字符串;
d1.strftime(fmt):和time模块format相同。

time类

datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ) 
  • 静态方法和字段
time.mintime.maxtime类所能表示的最小、最大时间。其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999);
time.resolution:时间的最小单位,这里是1微秒;
  • 方法和属性
t1 = datetime.time(10,23,15)#time对象
t1.hour、t1.minute、t1.second、t1.microsecond:时、分、秒、微秒;
t1.tzinfo:时区信息;
t1.replace([ hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变);
t1.isoformat():返回型如"HH:MM:SS"格式的字符串表示;
t1.strftime(fmt):同time模块中的format;

datetime类

datetime相当于datetime结合起来。
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
  • 静态方法和字段
datetime.today():返回一个表示当前本地时间的datetime对象;
datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间
datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
datetime.combine(date, time):根据date和time,创建一个datetime对象;
datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
  • 方法和属性
dt=datetime.now()#datetime对象
dt.yearmonthdayhourminutesecond、microsecond、tzinfo:
dt.date():获取date对象;
dt.time():获取time对象;
dt. replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ]):
dt. timetuple ()
dt. utctimetuple ()
dt. toordinal ()
dt. weekday ()
dt. isocalendar ()
dt. isoformat ([ sep] )
dt. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
dt. strftime (format)
  • .timedelta类,时间加减

使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算,如果要计算月份则需要另外的办法。

#coding:utf-8
from  datetime import *

dt = datetime.now()
#日期减一天
dt1 = dt + timedelta(days=-1)#昨天
dt2 = dt - timedelta(days=1)#昨天
dt3 = dt + timedelta(days=1)#明天
delta_obj = dt3-dt
print type(delta_obj),delta_obj#<type 'datetime.timedelta'> 1 day, 0:00:00
print delta_obj.days ,delta_obj.total_seconds()#1 86400.0

tzinfo时区类

#! /usr/bin/python
# coding=utf-8

from datetime import datetime, tzinfo,timedelta

"""
tzinfo是关于时区信息的类
tzinfo是一个抽象类,所以不能直接被实例化
"""
class UTC(tzinfo):
    """UTC"""
    def __init__(self,offset = 0):
        self._offset = offset

    def utcoffset(self, dt):
        return timedelta(hours=self._offset)

    def tzname(self, dt):
        return "UTC +%s" % self._offset

    def dst(self, dt):
        return timedelta(hours=self._offset)

#北京时间
beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8))
print "beijing time:",beijing
#曼谷时间
bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7))
print "bangkok time",bangkok
#北京时间转成曼谷时间
print "beijing-time to bangkok-time:",beijing.astimezone(UTC(7))

#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok
print "时差:",timespan

#Output==================
# beijing time: 2011-11-11 00:00:00+08:00
# bangkok time 2011-11-11 00:00:00+07:00
# beijing-time to bangkok-time: 2011-11-10 23:00:00+07:00
# 时差: -1 day, 23:00:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值