2017-07-31 45 views
1

我有以下文件:爲什麼「除了:」能夠捕捉到這個錯誤而不是「除了Exception,e:」?

from fabric.api import env, execute, run 

env.hosts = ['1.2.3.4'] 

def taskA(): 
    run('ls') 

def main(): 
    try: 
    execute(taskA) 
    except: 
    print "Exception Caught" 

main() 

我能看到「異常捕獲」字樣,當我運行此:

$ python test.py 
[1.2.3.4] Executing task 'taskA' 
[1.2.3.4] run: ls 

Fatal error: Timed out trying to connect to 1.2.3.4 (tried 1 time) 

Underlying exception: 
    timed out 

Aborting. 
Exception Caught 

然而,當我切換到這一點:

def main(): 
    try: 
    execute(taskA) 
    except Exception, e: 
    print "Exception Caught", e 

main() 

我沒有看到被捕的異常:

[1.2.3.4] run: ls 

Fatal error: Timed out trying to connect to 1.2.3.4 (tried 1 time) 

Underlying exception: 
    timed out 

Aborting. 

是否有原因能夠在上面的代碼中捕獲錯誤,而不是在下面?

+1

我沒有看到回溯,所以異常*被捕獲。你確定你打印正確嗎?另外,使用'except作爲e:'。 –

+2

@MartijnPieters:沒有回溯可能意味着它是一個SystemExit。 – user2357112

+0

@ user2357112好點! –

回答

5

此例外情況不是來自Exception。它看起來像是SystemExit,它直接來自BaseExceptionexcept Exception僅捕獲Exception的實例。

如果你真的想趕上絕對所有的異常,你可以做到這一點與

except BaseException as e: 

SystemExitsys.exit和一些類似的功能拋到導致解釋關機(或至少結束線程),同時仍然運行__exit__方法和finally塊。它也可以手動拋出。

BaseException存在如此SystemExit和一些類似的例外不會被except Exception塊捕獲,通常不打算處理它們。它類似於Java的Throwable。我個人希望except:塊沒有捕獲BaseException;它首先破壞了BaseException的一些目的。

4

當您使用except Exception, e,它

不趕BaseException或系統退出異常 SystemExitKeyboardInterruptGeneratorExit

其中作爲except捕獲所有異常類型。請參閱Difference between except: and except Exception as e: in Python

正如你看到使用except當「捕獲異常」的結果,但使用except Exception, e

不是當從工廠docs

如果一個Python異常被拋出,工廠中止與退出狀態1.

相關問題