python异常处理
### 异常处理
#### 0、异常
运行时产生的错误,叫做异常
#### 1、异常信息
```
#异常信息
#args:返回异常的错误编号和描述字符串;
#str(e):返回异常信息,但不包括异常信息的类型;
#repr(e):返回较全的异常信息,包括异常信息的类型。
```
案例
```
try:
1/0
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
print(str(e))
print(repr(e))
finally:
print("是否有异常都执行finally")
```
#### 2、异常处理
try-except-else-finally
```
#try处理
#except有异常处理
#esle有异常则处理,否则不处理
#finally是否有异常都处理
```
案例
```
try:
a = int(input("请输入 a 的值:"))
print(20*a)
except:
print("发生异常,执行except")
else:
print("如果有异常,执行 else 中的代码")
finally :
print("无论是否有异常,都执行 finally ")
```
#### 3、自定义异常
自定义异常类应该总是继承自内置的 `Exception` 类, 或者继承从 `Exception` 继承的类。
尽管所有类同时也继承自 `BaseException` ,但不应该使用这个基类来定义新的异常。`BaseException` 是为系统退出异常而保留的,比如 `KeyboardInterrupt` 或 `SystemExit` 以及其他那些会给应用发送信号而退出的异常。 捕获这些异常本身没什么意义。
假如你继承 `BaseException` 可能会导致你的自定义异常不会被捕获而直接发送信号退出程序运行。
```py
class MyException(Exception):
def __init__(self, *args):
self.args = args
```
案例
```python
class MyException(Exception): # 继承异常类
def __init__(self, name, reason):
self.name = name
self.reason = reason
from datetime import datetime
try:
if str(datetime.now()) > "2018":
raise MyException("TimeoutException", "time is overtime...")
except MyException as e:
print(e.name + ":" + e.reason)
```
#### 4、抛出异常
```
raise MyException('抛出异常')
```
案例
```py
#定义异常基类,然后在派生不同类型的异常
class loginError(MyException):
def __init__(self, code=100, message='登录异常', args=('登录异常',)):
self.args = args
self.message = message
self.code = code
class loginoutError(MyException):
def __init__(self):
self.args = ('退出异常',)
self.message = '退出异常'
self.code = 200
# raise loginError() # 这里突然返现 raise引发的异常将中断程序
#
try:
raise loginError()
except loginError as e:
print(e) # 输出异常
print(e.code) # 输出错误代码
print(e.message) # 输出错误信息
```
参考文献:[python自定义异常 - 简书 (jianshu.com)](https://www.jianshu.com/p/251fe443723d)