python的异常处理
异常
即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:例如下面的例子,执行程序的时候提示输入一个数字,如果输入的是数字,程序正常退出,如果不是数字,抛出错误,再继续输入
while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("That was no valid number. Try again ")
#输出
Please enter a number: kk
Oops! That was no valid number. Try again
Please enter a number: 88
Process finished with exit code 0
try语句按照如下方式工作;
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
- 抛出异常
Python 使用 raise 语句抛出一个指定的异常。例如:
>> raise NameError('HiThere')
Traceback (most recent call last):
File "F:\sublime\2243.py", line 1, in <module>
raise NameError("HiThere")
NameError: HiThere
- raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
>>> try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
time模块
- 时间
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。
Python 提供了一个 time 模块可以用于格式化时间。
时间间隔是以秒为单位的浮点小数。
每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。
Python 的 time 模块下有很多函数可以转换常见日期格式。如函数time.time()用于获取当前时间戳, 如下实例:
#!/usr/bin/python3
import time; # 引入time模块
ticks = time.time()
print ("当前时间戳为:", ticks)
#输出
当前时间戳为: 1524491497.901433
[Finished in 0.2s]
- 获取本地时间
localtime = time.localtime(time.time())
print ("本地时间为 :", localtime)
输出
本地时间为 : time.struct_time(tm_year=2018, tm_mon=4, tm_mday=23, tm_hour=21, tm_min=52, tm_sec=53, tm_wday=0, tm_yday=113, tm_isdst=0)
- 获取格式化的时间(看起来更直观)
localtime = time.asctime( time.localtime(time.time()) )
print ("本地时间为 :", localtime)
#输出
本地时间为 : Mon Apr 23 21:54:26 2018
- 格式化日期
我们可以使用 time 模块的 strftime 方法来格式化日期,
# 格式化成2018-04-23 21:56:39形式
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 格式化成Mon Apr 23 21:56:39 2018形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
#输出
2018-04-23 21:57:18
Mon Apr 23 21:57:18 2018
- time.sleep格式
time.sleep(secs)
推迟调用线程的运行,secs指秒数。
#!/usr/bin/python3
import time
print ("Start : %s" % time.ctime())
time.sleep( 5 )
print ("End : %s" % time.ctime())
#输出
Start : Mon Apr 23 21:59:28 2018
End : Mon Apr 23 21:59:33 2018
- time.strptime
time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’)
根据fmt的格式把一个时间字符串解析为时间元组。
import time
struct_time = time.strptime("23 Apr 18", "%d %b %y")
print ("返回元组: ", struct_time)
#输出
返回元组: time.struct_time(tm_year=2018, tm_mon=4, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=113, tm_isdst=-1)
subprocess 模块
- subprocess.call 和 subprocess.check_call
执行命令,返回状态码。
两者唯一的区别在于返回值。执行成功,都返回 0;执行失败,check_call 将raise出来一个CalledProcessError。
import subprocess
subprocess.call(['ls', '-l'])
subprocess.call(['ls -l'], shell=True)
注意shell=True 的用法,支持命令以字符串的形式传入。
- subprocess.getoutput(cmd)
以字符串的形式返回执行结果,错误或者正确都会返回,命令本身不会报错
import subprocess
a = subprocess.getoutput('ls /Users/wangxiansheng/desktops')
print(a)
print(type(a))
# 输出
ls: /Users/wangxiansheng/desktops: No such file or directory
<class 'str'>
- subprocess.getstatusoutput(cmd)
返回包含执行结果状态码和输出信息的元组。
import subprocess
a = subprocess.getstatusoutput('ls /Users/wangxiansheng/desktops')
print(a)
print(type(a))
#输出
(1, 'ls: /Users/wangxiansheng/desktops: No such file or directory')
<class 'tuple'>