尝试语句语法

时间:2015-12-05 05:26:23

标签: python python-2.7

我一直在阅读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语句必须有格式

  1. tryfinally
  2. tryexceptelsefinally
  3. 但在阅读文档后,它提到else是可选的,finally也是如此。所以,我想知道文档的目的是什么,向我们展示上述格式的代码?

1 个答案:

答案 0 :(得分:4)

执行有两种形式的try声明。它们之间的主要区别在于,在try1_stmt的情况下,必须指定except子句

在Python语言参考的 Introduction | Notation 中,写了以下内容:

  

星号(*)表示前面的零次或多次重复   项目;同样,加号(+)表示一次或多次重复,方括号([])中的短语表示零   或一次出现(换句话说,随附的短语是可选的)。 *和+运算符尽可能紧密地绑定;    括号用于分组

所以,具体来说,以第一种形式:

try1_stmt ::=  "try" ":" suite
               ("except" [expression [("as" | ",") identifier]] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]

elsefinally条款是可选的([]) ,您只需要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声明形式的原始提案。