- Python基础(十)
- 1、错误与异常处理
- 1.1、异常的概念
- 1.2、语法结构
- 1.3、try....except
- 1. 捕获指定的异常
- 2. 捕获多个异常
- 3. 捕获所有异常
- 1.4、else
- 1.5、finally
- 1.6、raise
- 1.7、自定义异常
- 1. 定义自定义异常
- 2. 抛出捕获自定义异常
- 1.8、异常讲解
- 1. 异常的捕获
- 2. 捕获多个或通用异常
- 3. 异常的抛出机制
- 1.9、常见的异常
- 2、小结
有时候代码存在缺陷,在执行程序的时候,执行到错误代码的时候,程序直接停止或抛出报错, 这是因为Python检测到一个错误时, 解释器就无法继续执行了, 出现了错误的提示,这样的现象就是"异常"。
1.2、语法结构最基础的捕获可以直包含try与except对异常进行处理,else与finally可以按实际情况添加
try:
< 代码块 >
except < 异常名1 >:
print('异常说明1')
except < 异常名2 >:
print('异常说明2')
else:
< 代码块 > # try语句中没有异常则执行此段代码
finally:
print("finally") # 无论是否发生异常都将会执行最后的代码
1.3、try…except
1. 捕获指定的异常
try:
print(a)
except NameError as msg:
print(msg)
print("666")
2. 捕获多个异常
try:
fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
print("hello world")
fp.close()
except GeneratorExit:
print("异常说明:GeneratorExit")
except FloatingPointError:
print("异常说明:FloatingPointError")
3. 捕获所有异常
try:
x = 3 / 0 # 程序出现异常,不会继续执行后面的代码
print("hello world")
except:
print("异常说明:分母不能为0")
1.4、else
如果判断在代码执行过程中没有异常的情况下执行其他的代码块,就可以使用else语句。
try:
print("aa")
except NameError as msg:
print(msg)
except Exception as msg:
print(msg)
else:
print("无错")
print("666")
1.5、finally
无论什么情况都将会执行finally里的代码块
try:
print(aa)
except NameError as msg:
print(msg)
except Exception as msg:
print(msg)
else:
print("无错")
finally:
print("finally")
print("666")
1.6、raise
主动触发异常
try:
raise Exception("raise Exception!") # 触发异常后,后面的代码就不会再执行
print("hello world")
except Exception as e:
print(e)
finally:
print("OK")
1.7、自定义异常
在开发的过程中可能会出现现有的异常类型不满足个人的开发需求,这是就可以自定义异常。
自定义异常,都要直接或间接继承Error或Exception类。
由开发者主动抛出自定义异常,在python中使用raise关键字。
1. 定义自定义异常- 定义一个类,直接或间接继承Error或Exception类
- 根据需求编写init方法
- 编写str方法,显示出错信息。以便于后期调整。
示例:
class MyException(Exception):
def __init__(self, leng):
self.leng = leng
def __str__(self):
print("长度是" + str(self.leng) + ",超过长度了")
2. 抛出捕获自定义异常
class MyException(Exception):
def __init__(self, leng):
self.leng = leng
pass
def __str__(self):
return ("长度是" + str(self.leng) + ",超过长度了")
pass
pass
def name_Test():
name = input("your name:")
try:
if len(name) > 4:
raise MyException(len(name)) # 抛出异常很简单,使用raise即可,但是没有处理,即捕捉
else:
print(name)
except MyException as msg:
print(msg)
finally:
print("okk")
# 调用函数,执行
name_Test()
print("结束")
1.8、异常讲解
1. 异常的捕获
- 将可能出错的代码放到try里面,except可以指定类型捕获异常。
- except里面的代码是捕获到异常时执行,将错误捕获,这样异常就不会导致解释器处理异常而导致整个程序崩溃。
- 一个try块可以捕获多个异常,每一个except可以代表一种异常。
- except如果指定了异常名就只会捕捉指定的异常,如果没有指定就会捕捉全部的异常。
- 不指定捕获异常名或指定为 Exception都可以捕获到全部的异常。
- 在运行时发生异常解释器会查找相应的异常捕获类型,如果在当前函数里面没有找到的话,它会将异常传递给上层的调用函数,看能否处理如果在最外层没有找到的话,解释器就会异常退出
- 所以说当有多层嵌套函数时,可以在最顶层捕获其余层的错误类型
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 — 用户代码生成的警告2、小结
- 错误与异常处理



