2015-08-27 22 views
-3

的下面的代碼的輸出是不同的,如果:如果函數定義在Python中主要爲什麼輸出不同?

def foo(): 
    try: 
     print 1/0 
    except Exception: 
     return 'Caught in foo' 

try: 
    print 'FOOO' 
    print foo() 
except Exception: 
    print 'Caught in main' 

OUTPUT:FOOO \ n陷入FOO

try: 
    print 'FOOO' 
    print foo() 
except Exception: 
    print 'Caught in main' 


def foo(): 
    try: 
     print 1/0 
    except Exception: 
     return 'Caught in foo' 

OUTPUT:FOOO \ n的主

陷入爲什麼是輸出不同在這兩種情況下?

+2

答案告訴你爲什麼總是最好只捕獲特定的異常,比如你的情況下的'ZeroDivisionError',而不是所有的異常,因爲它很難找到問題。 – meuh

回答

4

因爲他們提出了不同的例外。

All built-in, non-system-exiting exceptions are derived from Exceptionexcept Exception捕獲了大多數異常,並且這種行爲經常令人困惑。

你應該總是捕獲特定的例外,例如1/0提高ZeroDivisionError,你應該只趕上:

try: 
    print 'FOOO' 
    print foo() 
except ZeroDivisionError: 
    print 'Caught in foo' 

你會在輸出

FOOO 
Traceback (most recent call last): 
    File "<file>", line 3, in <module> 
    print (foo()) 
NameError: name 'foo' is not defined 

因爲它不是由except ZeroDivisionError抓(issubclass(NameError, ZeroDivisionError)False)看到不同的錯誤。

2

因爲在第二種情況下的例外是:

NameError: name 'foo' is not defined 

嘗試在主捕捉異常,或print它。 foo在您嘗試調用它時未定義。

1

因爲在第二種情況下,foo尚未定義,因此調用foo()會引發異常。

2

在您會收到以下錯誤第一種情況:

ZeroDivisionError: integer division or modulo by zero 

在第二種情況下,但是你得到:

NameError: name 'foo' is not defined 

因爲foo()功能尚未在定義出現第二個叫它。

相關問題