2012-09-11 146 views
10

我有這樣的Python代碼:Python的try塊不能捕獲使用os.system異常

import os 
try: 
    os.system('wrongcommand') 
except: 
    print("command does not work") 

代碼打印:

wrongcommand: command not found 

而不是command does not work。有誰知道爲什麼它不打印我的錯誤信息?

回答

18

如果你想擁有,當命令不存在拋出一個異常,你應該使用subprocess

import subprocess 
try: 
    subprocess.call(['wrongcommand']) 
except OSError: 
    print ('wrongcommand does not exist') 

試想想,你也許應該使用subprocess代替os.system反正...

+0

謝謝,這正是我所需要的。 – Cinder

1

wrongcommand: command not found是shell的輸出os.system用於調用該命令。 os.system沒有拋出異常

編輯:由mgilson的評論

+0

謝謝,但你如何在python中捕獲它?它甚至有可能嗎? – Cinder

+1

是的,但不使用'os.system()'。這就是爲什麼你應該使用'subprocess'模塊的原因之一,正如@ mgilson的答案中所述。 –

+0

更具體地說,'wrongcommand:command not found'是'os.system'用於調用該命令的* shell *的輸出。(具有不同'PATH'的不同shell可能會找到該命令)。 – mgilson

3

的複製和粘貼編輯部分中有您的代碼段兩個問題。首先,永遠不要僅僅做try: ... except:,總是要具體說明你想要處理的異常。否則,您的程序只會吞下任何類型的錯誤,也包括那些您不期望的錯誤。在大多數情況下,這會在運行時導致其他某些點出現意外的行爲。

此外,os.system()調用大部分時間應該由subprocess模塊中的對應部分替換。

要查看出了什麼問題,請忽略try/except塊並實際查看回溯/異常。正如其他人指出的那樣,您會注意到您的案例中沒有例外,這就是您的自定義字符串未打印的原因。底線:想想您的代碼塊中可能會出現哪些特定的異常。仔細想一想你認爲哪些因爲某些原因會發生並恰當地處理這些問題。不要處理那些你不期望的事情。

9

由於使用os.system()表示通過所述方法

  • 返回值= 0的退出代碼失敗! - >一切OK
  • 返回值= 0 - >一些錯誤

被調用命令的退出代碼直接傳回給Python。

有文件告訴你,如果發生故障,os.system()會提高豁免。 os.system()只是調用操作系統的底層系統()調用並返回其返回值。

請仔細閱讀os.system()文檔仔細