异常处理
错误Error:
- 逻辑错误: 算法错误, - => +
- 笔误: 变量名错误,语法错误
- 函数或类使用错误
- 错误可以避免
异常Exception:
- 本身就是意外情况
- 前提时没有出现上面的错误,即程序写的没有问题,但是某些情况下,会出现一些意外,导致程序无法正常执行下去
- open函数操作一个文件,文件不存在,或者创建一个文件时,文件已经存在了,或者访问一个网络文件,断网了,这都是异常,是意外情况
- 异常不可能避免
错误和异常:
在高级编程语言中,一般都有错误和异常的概念,异常可以捕获,并加以处理,但是错误是不能被捕获的
异常: 编译器对异常具有跟踪机制
错误:
产生异常:
- raise 语句显式抛出异常
- Python解释器自己检测到异常并引发
def ore():
print('before')
def lap():
print(1/0)
lap()
print('after')
ore()
def ore():
print('before')
raise Exception('exception!')
print('after')
ore()
程序会在异常抛出的地方中断执行,如果不捕获异常,就会提前结束程序
raise语句:
raise后什么都没有,表示抛出最近一个被激活的异常,如果没有被激活的异常,则抛RuntimeError异常
raise后要求应该是BaseException类或其子类或它们的实例,如果是类,将被无参实例化
try:
1/0
except BaseException:
try:
raise
except Exception as f:
print(f)
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+– ResourceWarning
异常的捕获:
try:
code block
except [except type]:
dealing except
try:
print('aaaaaaaaaaa')
print(1/0)
print('bbbbbbbbbbb')
except:
print('catch exception')
print('outer')
捕获指定类型的异常
try:
print('aaaaaaaaaaa')
print(1/0)
print('bbbbbbbbbbb')
except ArithmeticError:
print('catch exception')
print('outer')
异常类及继承层次
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+– ResourceWarning
python所有的标准异常类:
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
SystemExit | Python 解释器请求退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
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 | 用户代码生成的警告 |
BaseException及其子类
所有内建异常类的基类是BaseException
SystemExit
sys.exit()函数引发的异常,异常捕获处理,就直接交给python解释器,解释器退出
import sys
import time
try:
while 1:
time.sleep(1)
print('^'*40)
except KeyboardInterrupt:
print('bbbbbbbbbbbbbbbbbbb')
Exception及子类
Exception是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它
SyntaxError语法错误是不能捕获的
ArithmeticError :
算术计算引发的异常,其子类有除零异常等
LookupError:
使用映射的键或序列的索引无效时引发的异常的基类: IndexError KeyError
class MyException(Exception):
pass
try:
raise MyException
except MyException as e:
print(MyException.mro())
异常的捕获
except可以捕获多个异常
class MyException(Exception):
pass
try:
1/0
raise MyException
open('uiop')
except ZeroDivisionError:
print(1/0)
except MyException as e:
print(MyException.mro())
except Exception:
print('Exception')
f=None
try:
f=None
f=open('uiop')
except OSError as e:
print(e.args)
finally:
if f is not None:
f.close()
print(f)
print(dir()) # 查看f位于何作用域
class MyException(Exception):
def __init__(self):
self.e=a
try:
raise MyException
except MyException as e:
print(e,type(e))
except Exception as e:
print('^'*80)
print(e,type(e))
raise中构造MyException实例的时候,产生NameError异常,被raise收集
class MyException(Exception):
def __init__(self,e):
self.e=e
try:
raise MyException
except MyException as e:
print(e,type(e))
# except Exception as e:
# print('^'*80)
# print(e,type(e))
捕获到了TypeError异常
自定义异常类:
class MyException(Exception):
def __init__(self,code,msg):
self.code=code
self.msg=msg
try:
raise MyException(22,'uiop')
except MyException as e:
print(e.code,e.msg)
finally子句
try:
f=None
f=open('uiop')
except FileNotFoundError as e:
print('{} {} {}'.format(e.__class__,e.errno,e.strerror))
finally:
print('cleanup')
if f is not None:
f.close()
try:
f=open('uiop')
except:
pass
finally:
try:
f.close()
except:
pass
print('outer')
try:
f=open('uiop')
except Exception as e:
print('e: {}'.format(e))
finally:
try:
f.close()
except NameError as e:
print(e)
finally返回值
def ore():
try:
return 22
except:
pass
finally:
print('finally')
# return 33
print(ore()) # 观察返回值
def ore():
try:
return 22
except:
pass
finally:
print('finally')
return 33
print(ore()) # 观察返回值
import time,threading
def f1():
try:
1/0
finally:
print(11111111111)
def f2():
time.sleep(4)
try:
f1()
finally:
print(22222222222222222)
open('uioop')
while True:
time.sleep(1)
t=threading.Thread(target=f2,)
t.start()
while True:
time.sleep(1)
print('~~~'*40)
if t.is_alive():
print('alive')
else:
print('dead')
1 2 3 4 5 6 7 8 9 10 11 12 13 | try : try : ret=1/0 except KeyError as e: print(e) else : print( 'inner ok' ) finally : print( 'inner finsh' ) except: print( 'outer catch' ) finally : print( 'outer finsh' ) |
内部捕获不到异常,会向外层传递异常
但是如果内层有finally且其中有return,break,则异常不会继续向外抛出
def f():
try:
ret=1/0
except KeyError as e:
print(e.__slots__)
finally:
print('inner finish')
return 88888
try:
print(f())
except:
print('outer catch')
finally:
print('outer finish')
异常的捕获时机
def f():
try:
ret=1/0
except KeyError as e:
print(e.__slots__)
finally:
print('inner finish')
for b in range(5):
if b>3:
print(b)
break
try:
print(f())
except:
print('outer catch')
finally:
print('outer finish')
print(type(NotImplemented))
print(type(NotImplementedError))
NotImplemented 是个值,单值,是NotImplementedType的实例
NotImplementedError 是个类型,是异常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律