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
則在執行該子句后將重新引發該異常。 -
執行
except
orelse
子句期間可能會發生異常。同樣,在finally
執行該子句之后,將重新引發異常。 -
如果
try
語句到達break
,continue
或return
語句時,finally
條款將在<try or else or except的>break
,continue
或return
語句之前執行。 -
如果
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'