我一直在阅读python documentation,有人可以帮我解释这个吗?
try_stmt ::= try1_stmt | try2_stmt
try1_stmt ::= "try" ":" suite
("except" [expression [("as" | ",") identifier]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
try2_stmt ::= "try" ":" suite
"finally" ":" suite
我最初认为这意味着try语句必须有格式
try
和finally
或try
,except
,else
和finally
。但在阅读文档后,它提到else
是可选的,finally
也是如此。所以,我想知道文档的目的是什么,向我们展示上述格式的代码?
答案 0 :(得分:4)
您执行有两种形式的try
声明。它们之间的主要区别在于,在try1_stmt
的情况下,必须指定except
子句 。
在Python语言参考的 Introduction | Notation 中,写了以下内容:
星号(*)表示前面的零次或多次重复 项目;同样,加号(+)表示一次或多次重复,方括号([])中的短语表示零 或一次出现(换句话说,随附的短语是可选的)。 *和+运算符尽可能紧密地绑定; 括号用于分组 。
所以,具体来说,以第一种形式:
try1_stmt ::= "try" ":" suite
("except" [expression [("as" | ",") identifier]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
else
和finally
条款是可选的([])
,您只需要try
语句, 一个< / em> 或更多(+)
except
条款。
第二种形式:
try2_stmt ::= "try" ":" suite
"finally" ":" suite
仅只有一个try
和一个finally
子句,没有except
个子句。
请注意,对于第一种情况,else和finally子句的顺序是固定的。一个else
子句跟随一个finally
子句会产生SyntaxError
。
在一天结束时,这一切归结为基本上无法将try
子句与仅 else
子句一起使用。所以在代码形式中允许这两个:
第一种形式的try语句( try1_stmt
):
try:
x = 1/0
except ZeroDivisionError:
print("I'm mandatory in this form of try")
print("Handling ZeroDivisionError")
except NameError:
print("I'm optional")
print("Handling NameError")
else:
print("I'm optional")
print("I execute if no exception occured")
finally:
print("I'm optional")
print("I always execute no matter what")
第二种形式( try2_stmt
):
try:
x = 1/0
finally:
print("I'm mandatory in this form of try")
print("I always execute no matter what")
有关此主题的易于阅读的PEP,请参阅 PEP 341 ,其中包含两种try
声明形式的原始提案。