|
4 | 4 | "cell_type": "markdown",
|
5 | 5 | "metadata": {},
|
6 | 6 | "source": [
|
7 |
| - "# try/except/else 语句 \n", |
| 7 | + "# 1. try/except/else 语句 \n", |
8 | 8 | "try 是复合语句,它的最完整的形式如下:"
|
9 | 9 | ]
|
10 | 10 | },
|
|
32 | 32 | "cell_type": "markdown",
|
33 | 33 | "metadata": {},
|
34 | 34 | "source": [
|
35 |
| - "## 语句的运行方式 \n", |
| 35 | + "## 1.1 语句的运行方式 \n", |
36 | 36 | "- 如果 try 代码块语句执行时的确发生了异常,Python 就跳回 try,执行第一个符合引发异常的 except 子句下面的语句。当 except 代码块执行后,控制权就会到整个 try 语句后继续执行。\n",
|
37 | 37 | "- 如果异常发生在 try 代码块内,没有符合的 except 子句,异常就会向上传递到程序中的之前进入的 try 中,或者如果它是第一条这样的语句,就传递到这个进程的顶层,Python 会终止程序并打印默认出错消息。\n",
|
38 | 38 | "- 如果 try 首行底下执行的语句没有发生异常,Python 就会执行 else 行下的语句,控制权会在整个 try 语句下继续。\n",
|
39 | 39 | "\n",
|
40 |
| - "## try 语句分句 \n", |
| 40 | + "## 1.2 try 语句分句 \n", |
41 | 41 | "分句形式|说明\n",
|
42 | 42 | ":---|:---\n",
|
43 | 43 | "except:|捕捉所有(其他)异常类型\n",
|
|
69 | 69 | "cell_type": "markdown",
|
70 | 70 | "metadata": {},
|
71 | 71 | "source": [
|
72 |
| - "## try/else 分句 \n", |
| 72 | + "## 1.3 try/else 分句 \n", |
73 | 73 | "没有 else,是无法知道控制流程是否已经通过了 try 语句,因为没有异常引发或者因为异常发生了且已被处理过。"
|
74 | 74 | ]
|
75 | 75 | },
|
76 | 76 | {
|
77 | 77 | "cell_type": "markdown",
|
78 | 78 | "metadata": {},
|
79 | 79 | "source": [
|
80 |
| - "# try/finally 语句 \n", |
| 80 | + "# 2. try/finally 语句 \n", |
81 | 81 | "- 如果 try 代码块运行时没有异常发生,Python 会跳至执行 finally 代码块,然后在整个 try 语句后继续执行下去。\n",
|
82 | 82 | "- 如果 try 代码块运行时有异常发生,Python 依然会回来运行 finally 代码块,但是接着会把异常向上传递到较高的 try 语句或顶层默认处理器。程序不会在 try 语句下继续运行。\n",
|
83 | 83 | "\n",
|
|
88 | 88 | "cell_type": "markdown",
|
89 | 89 | "metadata": {},
|
90 | 90 | "source": [
|
91 |
| - "# 统一 try/except/finally 语句 \n", |
| 91 | + "# 3. 统一 try/except/finally 语句 \n", |
92 | 92 | "```\n",
|
93 | 93 | "try:\n",
|
94 | 94 | " main-action\n",
|
|
105 | 105 | "\n",
|
106 | 106 | "即使异常处理器或者 else-block 内有错误发生而引发了新的异常,finally-block 内的程序代码依然会执行。 \n",
|
107 | 107 | "\n",
|
108 |
| - "## 统一 try 语句语法 \n", |
| 108 | + "## 3.1 统一 try 语句语法 \n", |
109 | 109 | "方括号表示可选,星号表示0个或多个:\n",
|
110 | 110 | "```\n",
|
111 | 111 | "# format1\n",
|
|
134 | 134 | "cell_type": "markdown",
|
135 | 135 | "metadata": {},
|
136 | 136 | "source": [
|
137 |
| - "# raise 语句 \n", |
| 137 | + "# 4. raise 语句 \n", |
138 | 138 | "要显式地触发异常,可以使用 raise 语句。raise 关键字,后面跟着可选的要引发的类或者类的一个实例。 \n",
|
139 | 139 | "\n",
|
140 |
| - "## 引发异常 \n", |
| 140 | + "## 4.1 引发异常 \n", |
141 | 141 | "对于内置异常,如下两种形式是对等的,都会引发指定的异常类的一个实例,但是第一种形式隐式地创建实例:"
|
142 | 142 | ]
|
143 | 143 | },
|
|
210 | 210 | "\n",
|
211 | 211 | "一旦异常在程序中某处由一条 except 子句捕获,它就死掉了,除非由另一个 raise 语句或错误重新引发它。 \n",
|
212 | 212 | "\n",
|
213 |
| - "## 利用 raise 传递异常 \n", |
| 213 | + "## 4.2 利用 raise 传递异常 \n", |
214 | 214 | "raise 语句不包括异常名称或额外数据值时,就是重新引发当前异常。如果需要捕捉和处理一个异常,又不希望异常在程序代码中死掉,一般就会使用这种形式:"
|
215 | 215 | ]
|
216 | 216 | },
|
|
257 | 257 | "cell_type": "markdown",
|
258 | 258 | "metadata": {},
|
259 | 259 | "source": [
|
260 |
| - "## Python 3.X 异常链:raise from \n", |
| 260 | + "## 4.3 Python 3.X 异常链:raise from \n", |
261 | 261 | "Python 3.X 允许 raise 语句拥有一个可选的 from 子句:\n",
|
262 | 262 | "```\n",
|
263 | 263 | "raise exception from otherexception\n",
|
|
297 | 297 | "cell_type": "markdown",
|
298 | 298 | "metadata": {},
|
299 | 299 | "source": [
|
300 |
| - "# assert 语句 \n", |
| 300 | + "# 5. assert 语句 \n", |
301 | 301 | "assert 语句是 raise 常见使用模式的语法简写,assert 可视为条件式的 raise 语句:\n",
|
302 | 302 | "```\n",
|
303 | 303 | "assert <test>, <data>\n",
|
304 | 304 | "```\n",
|
305 | 305 | "如果 test 计算为假,Python 就会引发异常:data 项(如果提供了的话)是异常的额外数据。 \n",
|
306 | 306 | "\n",
|
307 |
| - "## 例子:收集约束条件(但不是错误) \n", |
| 307 | + "## 5.1 例子:收集约束条件(但不是错误) \n", |
308 | 308 | "assert 语句通常用于验证开发期间程序的状况。显示时,其出错消息正文会自动包括源代码的行信息,以及列在 assert 语句中的值:"
|
309 | 309 | ]
|
310 | 310 | },
|
|
371 | 371 | "cell_type": "markdown",
|
372 | 372 | "metadata": {},
|
373 | 373 | "source": [
|
374 |
| - "# with/as 环境管理器 \n", |
| 374 | + "# 6. with/as 环境管理器 \n", |
375 | 375 | "with/as 语句是作为常见 try/finally 用法模式的替代方案。with 语句支持更丰富的基于对象的协议,可为代码块定义支持进入和离开的动作。 \n",
|
376 | 376 | "\n",
|
377 |
| - "## 基本使用 \n", |
| 377 | + "## 6.1 基本使用 \n", |
378 | 378 | "```\n",
|
379 | 379 | "with expression [as variable]:\n",
|
380 | 380 | " with-block\n",
|
381 | 381 | "```\n",
|
382 | 382 | "expression 要返回一个对象,此对象也可返回一个值,赋值给变量名 variable。 \n",
|
383 | 383 | "\n",
|
384 |
| - "## 环境管理协议 \n", |
| 384 | + "## 6.2 环境管理协议 \n", |
385 | 385 | "with 语句实际工作方式:\n",
|
386 | 386 | "1. 计算表达式,所得到的对象称为环境管理器,它必须有 `__enter__` 和 `__exit__` 方法。\n",
|
387 | 387 | "2. 环境管理器的 `__enter__` 方法会被调用。如果 as 子句存在,其返回值会赋值给 As 子句中的变量,否则,直接丢弃。\n",
|
388 | 388 | "3. 代码块中嵌套的代码会执行。\n",
|
389 | 389 | "4. 如果 with 代码块引发异常,`__exit__`(type, value, traceback) 方法就会被调用。这些也是由 sys.exc_info 返回的相同值。如果此方法返回值为假,则异常会重新引发。否则,异常会终止。正常情况下异常是应该被重新引发,这样的话才能传递到 with 语句之外。\n",
|
390 | 390 | "5. 如果 with 代码块没有引发异常,`__exit__` 方法依然会被调用,其 type、value 以及 traceback 参数都会以 None 传递。 \n",
|
391 | 391 | "\n",
|
392 |
| - "## 多环境管理器 \n", |
| 392 | + "## 6.3 多环境管理器 \n", |
393 | 393 | "with 语句可以使用新的逗号语法指定多个环境管理器:"
|
394 | 394 | ]
|
395 | 395 | },
|
|
422 | 422 | "name": "python",
|
423 | 423 | "nbconvert_exporter": "python",
|
424 | 424 | "pygments_lexer": "ipython3",
|
425 |
| - "version": "3.6.5" |
| 425 | + "version": "3.6.8" |
426 | 426 | }
|
427 | 427 | },
|
428 | 428 | "nbformat": 4,
|
|
0 commit comments