2013-07-21 45 views
5

我正在使用Fabric進行自動化,包括創建目錄的任務。這裏是我的fabfile.py:打印Python異常類型(在織物中提升)

#!/usr/bin/env python 
from fabric.api import * 

def init(): 
    try: 
     local('mkdir ./www') 
    except ##what exception?##: 
     #print exception name to put in above 

運行晶圓廠fabfile.py和f我已經有./www創建拋出一個錯誤,但我不知道是什麼樣的,所以我不知道如何處理錯誤但。面料只打印了以下工作:

mkdir: cannot create directory ‘./www’: File exists 

Fatal error: local() encountered an error (return code 1) while executing 'mkdir ./www' 

Aborting. 

我想要做的是能找出錯誤類型,這樣我可以妥善除了我的錯誤,而毯聲明。如果答案不只是告訴我如何處理例外情況,而是打印(或以其他方式找到該名稱)任何例外情況,我可能會在該行中遇到(mkdir只是一個示例),這將非常有幫助。

謝謝!

+0

的[處理任意異常可能重複,打印默認異常消息](http://stackoverflow.com/questions/2005680/handle-arbitrary-exception-print-default-exception-message) – inspectorG4dget

+0

我試圖用這些,但它不工作,因爲我通過Fabric運行代碼,因此你的建議不起作用。不過謝謝。 – mh00h

回答

9

問題是,結構使用子進程做這些事情。如果你看看local的源代碼,你可以看到它實際上並沒有引發異常。它調用suprocess.Popen並使用communicate()來讀取stdout和stderr。如果有非零的返回碼,則它會將呼叫返回至warnabort。默認是中止。所以,做你想做的,試試這個:

def init(): 
    with settings(warn_only=True): 
     local('mkdir ./www') 

如果你看看源abort,它看起來像這樣:

10 def abort(msg): 
21  from fabric.state import output 
22  if output.aborts: 
23   sys.stderr.write("\nFatal error: %s\n" % str(msg)) 
24   sys.stderr.write("\nAborting.\n") 
25  sys.exit(1) 

所以,異常將是一個SystemExit例外。雖然你可以捕捉到這一點,但正確的方法是使用settings

+0

如果它保存了其他人的谷歌搜索:從fabric.api導入設置 – TristanMatthews

-1
def init(): 
    try: 
     local('mkdir ./www') 
    except Exception as e: 
     print e.__class__.__name__ 

這就是它的全部!

編輯:只需重新閱讀您的問題,並意識到我的代碼只會在您的情況下打印「致命」。它看起來像織物拋出一個錯誤,並返回自己的錯誤代碼,所以你必須看看文檔。我沒有織物的任何經驗,所以我建議你看看here,如果你還沒有。對不起,如果這沒有幫助!

0

通常,當你得到一個未捕獲的異常,Python會打印出異常,並顯示錯誤消息類型一起:

>>> raise IOError("Error message.") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: Error message. 

如果這沒有發生,你可能不會得到一個例外的。

如果你真的想抓住任意的例外並打印它,你想抓ExceptionBaseException。儘管如此,BaseException甚至會包含諸如KeyboardInterrupt之類的內容,所以請小心。

def init(): 
try: 
    local('mkdir ./www') 
except BaseException as e: 
    print "local() threw a", type(e).__name__ 
    raise # Reraise the exception 
-1

一般:

try: 
     some_code() 
    except Exception, e: 
     print 'Hit An Exception', e 
     raise 

會告訴你什麼是例外,但如果你不打算在實際處理一些例外後來乾脆擺脫嘗試的:除了:線將會有確切同樣的效果。

此外,如果您在調試器下運行您的代碼,那麼您可以查看您更詳細地點擊的例外。

3

這是什麼來處理與例外,它是從面料API

嘗試設置整個腳本的warn_only設置爲true與

env.warn_only = True