美文网首页
python基础-07-异常

python基础-07-异常

作者: 西海岸虎皮猫大人 | 来源:发表于2020-03-15 11:45 被阅读0次

1 概述

如何写合理的程序,使得程序不崩溃
通过if-else解决异常的坏处: 逻辑代码和错误处理混在一起
通过异常处理机制解决
所有异常父类BaseException
BaseException -> Exception- >NameError | ValueError | AttributeError等

# 碰到异常,解释器把异常包装成对象,抛出给解释器,停止当前执行路径
a  = 3/0
心态

把每个异常看做提高的机会

异常解决思路

1.查看错误信息,定位错误代码
2.百度查看10个相关帖子
3.以上步骤无法解决,寻求协助

# 相对复杂调用关系,定位异常位置
def a():
    num = 1/0
def b():
    a()
def c():
    b()

c()

2 try..一个except结构

# try包含可能发生异常的代码块
try:
    print('step1')
    a = 3/0
    print('step2')
# BaseException 所有异常根类
except BaseException as e:
    print('step3')
    print(e)
# 体会遇到异常的执行顺序
print('step4')
示例

循环输入数字,如果不是数字处理异常,直到输入88结束循环

while True:
    try:
      x = int(input('请输入一个数字'))
      print('输入的数字是:',x)
      if x==88:
          print('退出循环')
          break
    except:
        print('输入的不是数字')

print('程序结束')

3 try..多个except结构

建议尽量捕获尽可能多的异常
先子类后父类的顺序
最后加BaseException处理可能遗漏的异常

# coding=utf-8
# 测试多个except结构
try:
    a = input('请输入一个被除数')
    b = input('请输入一个除数')
    c = float(a)/float(b)
# pycharm右键可以查看异常的继承关系
except ZeroDivisionError:
    print('异常,不能除以0')
except ValueError:
    print('异常,不能将字符串转为数字')
except BaseException as e:
    print(e)

4 try..except..else结构

如果有异常执行except,如果没有执行else

try:
    a = int(input('被除数:'))
    b = int(input('除数'))
    c = a/b
except BaseException as e:
    print(e)
else:
    print(c)

5 finally结构

finally块无论是否异常都会执行,通常用来释放try块中申请的资源

try:
    a = int(input('被除数'))
    b = int(input('除数'))
    c = float(a)/float(b)
except BaseException as e:
    print(e)
else:
    print(c)
finally:
    print('finally无论异常与否都执行')
print('程序结束')
练习 - 文件操作异常处理
#coding=utf-8
try:
    f = open("d:/a.txt","r")
    content = f.readline()
    print(content)
except:
    print('文件未找到')
finally:
    print('finally关闭资源')
    try:
        f.close()
    except BaseException as e:
        print(e)

6 常见异常

return语句通常不放在异常处理结构语句中,而放在最后

常见异常及解决

SyntaxError:
语法错误
int a = 3

NameError:
尝试访问一个没有声明的变量
print(a)

ZeroDivisionError:
除数为0

ValueError:
数值错误
float('aaa')

TypeError:
类型错误
print('aaa' + 100)

Attribute:
访问不存在的属性

Index:
索引越界

KeyError:
字典关键字不存在

其他异常汇总 - 混脸熟

ArithmeticError 所有数值计算错误的基类
AssertionError 断言语句失败
AttributeError 对象没有这个属性
BaseException 所有异常的基类
DeprecationWarning 关于被弃用的特征的警告
EnvironmentError 操作系统错误的基类
EOFError 没有内建输入,到达EOF 标记
Exception 常规错误的基类
FloatingPointError 浮点计算错误
FutureWarning 关于构造将来语义会有改变的警告
GeneratorExit 生成器(generator)发生异常来通知退出
ImportError 导入模块/对象失败
IndentationError 缩进错误
IndexError 序列中没有此索引(index)
IOError 输入/输出操作失败
KeyboardInterrupt 用户中断执行(通常是输入^C)
KeyError 映射中没有这个键
LookupError 无效数据查询的基类
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象(没有属性)
NotImplementedError 尚未实现的方法
OSError 操作系统错误
OverflowError 数值运算超出最大限制
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
StandardError 所有的内建标准异常的基类
StopIteration 迭代器没有更多的值
SyntaxError Python 语法错误
SyntaxWarning 可疑的语法的警告
SystemError 一般的解释器系统错误
SystemExit 解释器请求退出
TabError Tab 和空格混用
TypeError 对类型无效的操作
UnboundLocalError 访问未初始化的本地变量
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeError Unicode 相关的错误
UnicodeTranslateError Unicode 转换时错误
UserWarning 用户代码生成的警告
ValueError 传入无效的参数
Warning 警告的基类
WindowsError 系统调用失败
ZeroDivisionError 除(或取模)零(所有数据类型)

7 上下文管理 - with

通过with上下文管理,更方便地释放资源
在文件操作\网络通信相关场景非常常用
with不是用来取代try,只是作为补充

with open('d:/aaa.txt','r') as f:
    content = f.readline()
    print(content)

8 traceback模块

#coding=utf-8
import traceback

try:
    print('step')
    num = 1/0
except:
    # 打印完整异常信息
    traceback.print_exc()

# 异常信息输入到文件
try:
    print('step')
    num = 1/0
except:
    with open('d:/a.txt','a') as f:
        traceback.print_exc(file=f)

9 自定义异常类

自定义异常继承Exception或其子类,命名一般以Exception或Error结尾

class AgeError(Exception): # 继承Exception
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo = errorInfo

    def __str__(self):
        return '年龄错误'

# 如果为True,则模块作为独立文件执行,可以执行测试代码
if __name__ == '__main__' 
    age = int(input('输入一个年龄'))
    if age<1 or age>100:
        raise AgeError(age)
    else:
        print('正常的年龄:',age)    

10 pycharm调试模式

设置断点

行号单击,再次单击取消断点

进入调试视图

Frames 线程视图
variables 变量视图
step over f8 函数整体执行一步,如果函数内有断点则跳至断点处
step into 进入方法内部
step out 函数剩余步骤全部执行完
new watch 设置观察器,可观察变量
run to cursor 执行到光标处

相关文章

网友评论

      本文标题:python基础-07-异常

      本文链接:https://www.haomeiwen.com/subject/ujhcehtx.html