1. 程式人生 > >python異常處理和模組

python異常處理和模組

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'>