python基础之Day11 异常调试

异常的本质

如果没有异常机制,会发生:

  1. 逻辑代码和错误处理代码放一起!
  2. 程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!

异常:程序运行过程中出现的非正常现象,如除数为零等。
异常处理:程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。

python 中内建异常类的继承层次:

在这里插入图片描述
红框中为常用异常类。

异常处理

  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。(关键要定位

在这里插入图片描述

  1. 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。

try…一个except结构

语法结构

try:
\qquad 被监控的可能引发异常的语句块
except BaseException [as e]:
\qquad 异常处理语句块
as e 中的e是将异常记录为e,可打印

执行try块
发生异常
未发生异常
跳过 ecept 块
跳过try块中的后续代码, 执行except 块
后续代码
print('begin now')
try:
    print('try step1')
    a=2/0
    print('skip the words')
except BaseException as e:
    print('find an error\n',type(e),':',e)
print('continue')

在这里插入图片描述

示例

输入数字,否则返回错误,重复多次

while True:
    try:
        num=int(input('请输入数字'))
        print('你输入的是{}'.format(str(num)))
        if num==888:
            break
    except BaseException as e:
        print('发现异常:您输入的不是数字\n',type(e),e)
print('end!!')

在这里插入图片描述

try… 多个except 结构

尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException

语法结构

try:
\qquad 被监控的、可能引发异常的语句块
except Exception1:
\qquad 处理 Exception1 的语句块
except Exception2:
\qquad 处理 Exception2 的语句块

except BaseException:
\qquad 处理可能遗漏的异常的语句块

try…except…else结构

增加了“else 块”。

语法结构

try:
\qquad 被监控的、可能引发异常的语句块
except Exception1:
\qquad 处理 Exception1 的语句块
except Exception2:
\qquad 处理 Exception2 的语句块

except BaseException:
\qquad 处理可能遗漏的异常的语句块
else:
\qquad else语句

执行try块
发生异常
未发生异常
有else块,跳过ecept块,执行else块
跳过try块中的后续代码, 执行except
后续代码

try…except…finally结构

finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。例如,打开一个文件后,后面一定要关闭。
try:
\qquad 被监控的、可能引发异常的语句块
except Exception1:
\qquad 处理 Exception1 的语句块
except Exception2:
\qquad 处理 Exception2 的语句块

except BaseException:
\qquad 处理可能遗漏的异常的语句块
else:
\qquad else语句
finally:
\qquad finally语句

try:
	f = open( "d:/a .txt", 'r')
	content = f.readline()
	print(content)
except BaseException  as e:
	print('错误为',e)
finally:
	f.close() #因为不存在该文件,所以finally快也会报错

在这里插入图片描述

try:
	f = open( "d:/a .txt", 'r')
	content = f.readline()
	print(content)
except BaseException  as e:
	print('try块错误为',e)
finally:
    try:
	    f.close() #因为不存在该文件,所以finally快也会报错
    except BaseException as e:
        print('finally块中的错误为',e)

在这里插入图片描述

执行try块
发生异常
未发生异常
跳过ecept块
有else块,跳过ecept块,执行else块
跳过try块中的后续代码, 执行except
执finally块
后续代码

return语句

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。

语法结构

try:
\qquad 被监控的、可能引发异常的语句块
except Exception1:
\qquad 处理 Exception1 的语句块
except Exception2:
\qquad 处理 Exception2 的语句块

except BaseException:
\qquad 处理可能遗漏的异常的语句块
return 返回值

常见异常的解决

ython 中的异常都派生自 BaseException 类

常见错误说明例子
SyntaxError语法错误int a =1
SyntaxError: invalid syntax
NameError尝试访问一个没有申明的变量print(a)
NameError: name ‘a’ is not defined
ZeroDivisionError除数为 0 错误(零除错误)a = 3/0
ZeroDivisionError: division by zero
ValueError数值错误float(“yueyue”)
ValueError: could not convert string to float: ‘gaoqi’
TypeError类型错误123+"abc"
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
AttributeError访问对象的不存在的属性a.name()
AttributeError: ‘int’ object has no attribute ‘name’
IndexError索引越界异常a[10]
IndexError: list index out of range
KeyError字典的关键字不存在a[‘name’]
KeyError: ‘salary’

常见异常汇总

异常名称说明
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迭代器没有更多的值
SyntaxErrorPython 语法错误
SyntaxWarning可疑的语法的警告
SystemError一般的解释器系统错误
SystemExit解释器请求退出
TabError Tab和空格混用
TypeError对类型无效的操作
UnboundLocalError访问未初始化的本地变量
UnicodeDecodeError Unicode解码时的错误
UnicodeEncodeError Unicode编码时错误
UnicodeError Unicode相关的错误
UnicodeTranslateErrorUnicode 转换时错误
UserWarning用户代码生成的警告
ValueError传入无效的参数
Warning警告的基类
WindowsError系统调用失败
ZeroDivisionError除(或取模)零 (所有数据类型

with上下文管理

  1. with上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的现场或上下文(不是用来取代try,)。
  2. 不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。
  3. 文件操作、网络通信相关的场合非常常用.

语法结

with context_expr [ as var]:
\qquad 语句块

 with open( "d:/a.txt")  as f:
    for line  in f:
        print(line)

trackback 模块

traceback模块可用来打印异常信息,特别是在try…except结构可以打印异常出现的位置,,用traceback.print_exc(),可得到我们平时遇到异常时得到的报错信息。

import traceback
try:
    a==9
except BaseException  as e:
    traceback.print_exc()

在这里插入图片描述
还可将异常信息输出到文件

import traceback
try:
	print( "step1")
	num = 1/0
 except:
import traceback
try:
    a==9
except BaseException  as e:
    with open("d:/a.txt", "a")  as f:
        traceback.print_exc(file=f)

自定义异常类

自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error、Exception 为后缀,由 raise 语句主动抛出。

class IQerror(Exception):
    def __init__(self,errorinfo):
        Exception.__init__(self)
        self.errorinfo=errorinfo
    def __str__(self):
        if self.errorinfo<90:
            return '可可爱爱,没有脑袋'
        else:
            return '智商惊人,叹为观止!'

if __name__=='__main__':
    IQ=int(input('请输入您的智商'))
    if 90<IQ<=140:
        print('您长得是一个正常的脑子')
    else:
        raise IQerror(IQ)

Pycharm开发环境的调试

进行调试的核心是设置断点。程序执行到断点时,暂时挂起,停止执行,可以详细的观看停止处的每一个细节。

  1. 设置断点:在行号后面单击即可增加断点(在断点上再单击即可取消断点)
  2. 进入调试视图:
    a. 单击工具栏上的按钮(虫子)
    b. 右键单击编辑区,点击:debug ‘模块名’
    c. 快捷键:shift+F9

在这里插入图片描述

区域说明
浏览帧调试器列出断点处,当前线程正在运行的方法,每个方法对应一个“栈帧”。最上面的是当前断点所处的方法。
变量值观察区调试器列出了断点处已存在的变量值。我们可以通过它,查看变量的值的变化。也可增加要观察的变量
名称快捷键说明
show Execution PointAlt+F10显示当前所有断点
step overF8若当前执行的是一个函数,则会把这个函数当做整体一步执行完。不会进入这个函数内部。
step intoF7若当前执行的是一个函数,则进入函数内部(单步调试)
step outShift+F8当单步执行到子函数内时,用 step out就可以执行完子函数余下部分,并返回到上一层函数(若当前是主函数,则结束主函数)
run to cursorAlt+F9一直执行,到光标处停止,用在循环内部时,点击一次就执行一个循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值