1 try-except
比如我们要打开一个不存在的文件,它会报错
f=open('no.txt','r')
f.read()
'''
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-54-2709fabe0da7> in <module>
----> 1 f=open('no.txt','r')
2 f.read()
FileNotFoundError: [Errno 2] No such file or directory: 'no.txt'
'''
我们可以用try-except 实现
try:
f=open('no.txt','r')
print(f.read())
except FileNotFoundError as e:
print(e)
f=open('no.txt','w')
f.write('new file')
f.close()
'''
[Errno 2] No such file or directory: 'no.txt'
'''
但是如果我们except里面使用了不匹配的error 还是会报错
try:
f=open('no1.txt','r')
print(f.read())
except KeyError as e:
print(e)
f=open('no1.txt','w')
f.write('new file')
f.close()
'''
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-56-5e0e21b6da44> in <module>
1 try:
----> 2 f=open('no1.txt','r')
3 print(f.read())
4 except KeyError as e:
5 print(e)
FileNotFoundError: [Errno 2] No such file or directory: 'no1.txt'
'''
解决方法是使用基类Error
try:
f=open('no1.txt','r')
print(f.read())
except BaseException as e:
print(e)
f=open('no1.txt','w')
f.write('new file')
f.close()
2 多except异常处理
d = {"name": "f1", "age": 2}
l = [1,2,3]
try:
v = d["gender"]
l[3] = 4
except KeyError as e:
print("key error for:", e)
d["gender"] = "x"
except IndexError as e:
print("index error for:", e)
l.append(4)
print(d)
print(l)
'''
key error for: 'gender'
{'name': 'f1', 'age': 2, 'gender': 'x'}
[1, 2, 3]
'''
但是此时有一点需要注意:它不会同时处理字典的 KeyError
和列表的 IndexError
因为在程序顺序执行的时候,只要是报错了, 那么就会终止错误之后的代码,进入错误 回收 环节。这个回收环节在上面的案例中也就是 except
的错误处理环节。
换句话说,except语句只能执行一个。
所以上述例子中,列表l并没有被append
3 try-except-else 语句
try-except和前面的一样,在 else
中处理没有报错的情况。
l = [1,2,3]
try:
l[3] = 4
except IndexError as e:
print(e)
else:
print("no error, now in else")
print(l)
'''
list assignment index out of range
'''
#此时是有异常的,所以执行的是except里面的语句
l = [1,2,3,-4]
try:
l[3] = 4
except IndexError as e:
print(e)
else:
print("no error, now in else")
print(l)
'''
no error, now in else
[1, 2, 3, 4]
'''
#此时没有异常,所以执行的是try和else里面的语句
4 try-except-finally 语句
try-except和前面的一样,finally中的语句,不管有没有异常,都会执行
在有些情况下,加不加finally,好像没啥区别
没有异常:
l = [1,2,3,-1] try: l[3] = 4 except IndexError as e: print(e) finally: print("reach finally") ''' reach finally '''
l = [1,2,3,-1] try: l[3] = 4 except IndexError as e: print(e) print("reach finally") ''' reach finally '''
有异常:
l = [1,2,3] try: l[3] = 4 except IndexError as e: print(e) print("reach finally") ''' list assignment index out of range reach finally '''
l = [1,2,3] try: l[3] = 4 except IndexError as e: print(e) finally: print("reach finally") ''' list assignment index out of range reach finally '''
所以,finally语句什么使用需要用到呢?
我们看下面这个例子:
l = [1,2,3] try: l[3] = 4 print("reach finally") ''' File "<ipython-input-71-5a32d8788477>", line 6 print("reach finally") ^ SyntaxError: invalid syntax ''' l = [1,2,3] try: l[3] = 4 finally: print("reach finally") ''' reach finally --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-75-26ba6fe359fd> in <module> 1 l = [1,2,3] 2 try: ----> 3 l[3] = 4 4 finally: 5 print("reach finally") IndexError: list assignment index out of range '''
虽然都是报错,但是加了finally之后,就是先执行完finally中的语句,再报错
5 raise
手动触发异常
def no_negative(num):
if num < 0:
raise ValueError("I said no negative")
return num
print(no_negative(-1))
'''
Traceback (most recent call last):
File "/lib/python3.8/asyncio/futures.py", line 178, in result
raise self._exception
File "/lib/python3.8/asyncio/tasks.py", line 280, in __step
result = coro.send(None)
File "/lib/python3.8/site-packages/pyodide/_base.py", line 419, in eval_code_async
return await CodeRunner(
File "/lib/python3.8/site-packages/pyodide/_base.py", line 276, in run_async
res = eval(last_expr, self.globals, self.locals)
File "<exec>", line 6, in <module>
File "<exec>", line 3, in no_negative
ValueError: I said no negative
'''
注:这里raise 后面的error类型,必须是python 中定义的异常错误类型名称(见第6小节)
6 python 异常错误名称表
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
参考内容:如何控制异常 try-except - 交互式学Python | 莫烦Python (mofanpy.com)