84 lines
2.9 KiB
Markdown
84 lines
2.9 KiB
Markdown
# python3小白课:自己引发异常
|
||
|
||
### raise引发异常
|
||
|
||
当程序出现系统预先内置定义的异常类的时候,会自动引发异常。但有些时候,我们根据业务的需要,某些计算得到的业务数据不符合规范等场景,在我们看来也属于异常结果了,这些异常我们想要进行特别处理,这时候就需要我们通过代码来自己引发异常。
|
||
|
||
在python中,可以使用raise语句来引发异常。
|
||
|
||
raise语句有三种常见的用法:
|
||
|
||
* 只用raise关键字:会引发当前上下文中捕获的异常,默认会引发RuntimeError异常。
|
||
* raise 异常类名称:raise后带一个异常类,引发指定异常类的默认实例。
|
||
* raise 异常类名称(描述信息):引发指定的异常对象。
|
||
|
||
这几种方法本质上都是引发一个异常实例,而一个raise语句只能引发一个异常实例。
|
||
|
||
来先看个例子吧:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
a = 1
|
||
if a == 1:
|
||
raise
|
||
```
|
||
|
||
运行后我们可以看到,raise语句可以脱离try结构而使用,但一般没啥实际意义,会自动触发默认的RuntimeError。
|
||
|
||
我们一般会这么用:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
try:
|
||
a = 1 / 0
|
||
except Exception as e:
|
||
print(e)
|
||
raise
|
||
```
|
||
|
||
可以看到,try块有异常触发了except块的代码,先打印了异常对象e的内容,然后使用raise再次引发了上下文的这个ZeroDivisionError异常。
|
||
|
||
我们还可以这样写:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
try:
|
||
raise ValueError
|
||
except ValueError:
|
||
print("触发了ValueError异常")
|
||
except:
|
||
print("触发了其他异常")
|
||
```
|
||
|
||
还可以指定异常信息:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
raise ValueError("值异常,我自己写的信息")
|
||
```
|
||
|
||
---
|
||
|
||
### 自定义异常类
|
||
|
||
前面部分的学习是让我们掌握了触发异常类的方法,在使用raise关键字的时候,不单单只能引发系统已经定义好的异常类,你还可以自定义你自己名字的异常类,这样可以更明确的展现异常,最大限度地提供异常的有用信息,raise语句也可以触发自定义的异常类。
|
||
|
||
自定义的异常类都应该继承自`Exception`基类或者它的子类,而且定义也很简单,无需书写过多代码,只需要指定自定义异常类的父类即可。举个例子:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
# 名字只是为了让程序更加有可读性,你可以自定义异常类类名,一般加个Exception结尾啥的好认
|
||
class XiaobaiException(Exception): pass
|
||
raise XiaobaiException("小白报错啦!")
|
||
```
|
||
|
||
|
||
|
||
### 单词释义
|
||
|
||
| 单词 | 释义 |
|
||
| ----------------- | ---------------------------------- |
|
||
| raise | 提升,提起,在python中用来引发异常 |
|
||
| RuntimeError | 运行时异常 |
|
||
| ZeroDivisionError | 零除异常,除数为0的时候抛出 |
|
||
| ValueError | 值异常 | |