python中else與finally的總結


 

1.else的用法

 

 對try...except的補充:

else子句的使用比在子句中添加其他代碼更好,try因為它避免了意外捕獲由try... except語句保護的代碼未引發的異常

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except OSError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

 

2.finally用法

try語句有一個可選finally子句,用於定義在所有情況下都必須執行的finally操作

try:
    raise KeyboardInterrupt
finally:
    print('Goodbye, world!')


Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>

 

如果存在finally子句,則該finally子句將作為try語句完成之前的最后一項任務執行。finally無論該try語句是否產生異常,該子句都會運行。

以下幾點討論了發生異常時更復雜的情況:

  • 如果在執行該try子句期間發生異常,則該異常可以由except子句處理。如果該異常未由except子句處理,finally則在執行該子句后將重新引發該異常。

  • 執行exceptor else子句期間可能會發生異常。同樣,在finally執行該子句之后,將重新引發異常。

  • 如果try語句到達breakcontinuereturn語句時,finally條款將在<try or else or except的>breakcontinuereturn語句之前執行。

  • 如果finally子句包含一條return語句,則該finally子句的return語句將在<try or else or except的>子句中的return語句之前執行,所以事實上執行了的是finally的return,而不是在<try or else or except>中執行return語句。

案例1. 

>>> def bool_return():
...     try:
...         return True
...     finally:
...         return False
...
>>> bool_return()
False

 案例2.

def bool_return():
    try:
        raise Exception
    except Exception:
        return True
    finally:
        return False

print(bool_return())
False

 

 案例3.

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM