1
0

复合语句 - 异常

This commit is contained in:
周中平 2022-02-11 16:57:39 +08:00
parent 99a8085e40
commit 058e3c563d
No known key found for this signature in database
GPG Key ID: B1DF9DD42D8E00DC

View File

@ -149,6 +149,75 @@ for n in range(2, 10):
"""
```
## 异常
### try、except、finally
1. `except`语句不是必须的,`finally`语句也不是必须的,但是二者必须要有一个,否则就没有`try`的意义了。
2. `except`语句可以有多个Python会按`except`语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的`except`语句。
3. `except`语句可以以元组形式同时指定多个异常,参见实例代码。
4. `except`语句后面如果不指定异常类型则默认捕获所有异常你可以通过logging或者sys模块获取当前异常。
5. 如果要捕获异常后要重复抛出,请使用`raise`,后面不要带任何参数或信息。
6. 不建议捕获并抛出同一个异常,请考虑重构你的代码。
7. 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
8. 尽量使用内置的异常处理语句来替换`try/except`语句,比如`with`语句,`getattr()`方法。
```python
def div(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("Error: b should not be 0 !!")
except Exception as e:
print("Unexpected Error: {}".format(e))
else:
print('Run into else only when everything goes well')
finally:
print('Always run into finally block.')
# tests
div(2, 0)
div(2, 'bad type')
div(1, 2)
# Mutiple exception in one line
try:
print(a / b)
except (ZeroDivisionError, TypeError) as e:
print(e)
# Except block is optional when there is finally
try:
open(database)
finally:
close(database)
# catch all errors and log it
try:
do_work()
except:
# get detail from logging module
logging.exception('Exception caught!')
# get detail from sys.exc_info() method
error_type, error_value, trace_back = sys.exc_info()
print(error_value)
raise
```
### raise
`raise`语句支持强制触发指定的异常。例如:
```python
raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: HiThere
```
## 其他
### pass