建网站必需服务器吗,行业导航类网站模板,哪个软件可以看街道实景,息烽做网站公司有哪些异常的本质_调试错误
异常是什么#xff1f;
软件程序在运行过程中#xff0c;非常可能遇到刚刚提到的这些问题#xff0c;我们称之为异常#xff0c;英文是#xff1a;Exception#xff0c;意思是例外。遇到这些例外情况#xff0c;或者叫异常。
伪代码说明异常机制…异常的本质_调试错误
异常是什么
软件程序在运行过程中非常可能遇到刚刚提到的这些问题我们称之为异常英文是Exception意思是例外。遇到这些例外情况或者叫异常。
伪代码说明异常机制
如果我们要拷贝一个文件在没有异常机制的情况下我们需要考虑各种异常情况伪代码如下 这种方式有两个坏处
逻辑代码和错误处理代码放一起程序员本身需要考虑的例外情况较复杂对程序员本身要求较高
如上情况如果是用Python的异常机制来处理对比如下 异常机制本质 当程序出现异常程序安全的退出、处理完后继续执行的机制 python中引进了很多用来描述和处理异常的类称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次 我们处理一下遇到的第一个异常
#测试简单的0不能做除数异常
a 3/0出现异常
Traceback (most recent call last):File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 2, in modulea 3/0~^~
ZeroDivisionError: division by zero
python中一切都是对象异常也采用对象的方式来处理。处理过程
抛出异常在执行一个方法时如果发生异常则这个方法生成代表该异常的一个对象停止当前执行路径并把异常对象提交给解释器。捕获异常解释器得到该异常后寻找相应的代码来处理该异常
异常的解决思路
解决异常问题的态度
学习完异常相关知识点只是开始对异常有些认识不意味着你会调试任何异常调试异常需要大量的经验作为基础。因此大家不要在此停留继续往后学习。碰到每个异常都要花心思去解决而不要动不动张口问人。通过自己的努力无法解决再去找老师同学帮助解决。
解决每一个遇到的异常建议大家遵循如下三点
不慌张细看信息定位错误。看清楚报的错误信息并定位发生错误的地方。百度并查看十个相关帖子。将异常类信息进行百度至少查看十个以上的相关帖子。以上两步仍然无法解决找朋友协助解决。
异常解决的关键定位
当发生异常时解释器会报相关的错误信息并会在控制台打印出相关错误信息。我们只需按照从上到下的顺序即可追溯Trackback错误发生的过程最终定位引起错误的那一行代码。
【示例】追溯异常发生的过程
def a():print(run in a() start! )num 1/0print(run in a() end! )
def b():print(run in b() start!)a()print(run in b() end! )def c():print(run in c() start!)b()print(run in c() end! )print(step1)
c()
print(step2)step1
run in c() start!
run in b() start!
run in a() start!
Traceback (most recent call last):File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 16, in modulec()File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 12, in cb()File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 7, in ba()File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 3, in anum 1/0~^~
ZeroDivisionError: division by zero
try_except基本结构
try...一个except结构
try...except是最常见的异常处理结构。结构如下
try:被监控的可能引发异常的语句块
except BaseException [as e]:异常处理语句块异常处理语句块
try块包含着可能引发异常的代码except块则用来捕捉和处理发生的异常。执行的时候如果try块中没有引发异常则跳过ecept块继续执行后续代码执行的时候如果try块中发生了异常则跳过try块中的后续代码跳到相应的except块中处理异常异常处理完后继续执行后续代码。
【示例】遇到异常的执行顺序
#测试简单的0不能做除数异常
try:print(step1)a 3/0print(step2)
except BaseException as e:print(step3)print(e)
print(step4)除数为0遇到异常输出结果
step1
step3
division by zero
step4【示例】循环输入数字如果不是数字则处理异常直到输入88则结束循环。
while True:try:x int(input(请输入一个数字))print(您入的数字是,x)if x88:print(退出程序)breakexcept:print(异常输入的不是一个数字)执行结果
请输入一个数字12
您入的数字是 12
请输入一个数字abc
异常输入的不是一个数字
请输入一个数字
异常输入的不是一个数字
请输入一个数字88
您入的数字是 88
退出程序try...多个except结构
一般建议尽量捕获可能出现的多个异常按照先子类后父类的顺序并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常可以在最后增加BaseException。结构如下
try:被监控的、可能引发异常的语句块
except Exception1:处理Exception1的语句块
except Exception2:处理Exception2的语句块
[...]
except BaseException处理可能遗漏的异常的语句块【示例】多个except结构
try:a input(请输入被除数)b input(请输入除数)c float(a)/float(b)print(c)
except ZeroDivisionError:print(异常除数不能为0)
except TypeError:print(异常除数和被除数都应该为数值类型)
except BaseException as e:print(e)print(type(e))测试
请输入被除数100
请输入除数0
异常除数不能为0
try...except...else结构
try...except...else结构增加了else块。如果try块中没有抛出异常则执行else块。如果try块中抛出异常则执行except块不执行else块。
【示例】try...except...else结构执行测试
try:a input(请输入被除数)b input(请输入除数)c float(a)/float(b)
except BaseException as e:print(e)
else:print(除的结果是,c)发生异常的执行情况执行except块没有执行else
请输入被除数100
请输入除数0
float division by zero没有发生异常的执行情况执行完try块后执行else
请输入被除数10
请输入除数5
除的结果是 2.0try...except...finally结构
try...except...finally结构中finally块无论是否发生异常都会被执行通常用来释放try块中申请的资源。
【示例】try...except...finally结构简单测试
try:a input(请输入一个被除数)b input(请输入一个除数)c float(a)/float(b)
except BaseException as e:print(e)
else:print(c)
finally:print(我是finally中的语句无论发生异常与否都执行)
print(程序结束)执行结果如下
请输入一个被除数100
请输入一个除数0
float division by zero
我是finally中的语句无论发生异常与否都执行
程序结束
【示例】读取文件finally中保证关闭文件资源
try:f open(d:/a.txt,r)content f.readline()print(content)
except BaseException as e:print(e)
finally:f.close() #释放资源。此处也可能会发生异常。若发生异常则程序终止,不会继续往下执行
print(step4)发生异常的执行结果
Traceback (most recent call last):File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 8, in modulef.close() #释放资源。此处也可能会发生异常。若发生异常则程序终止,不会继续往下执行^
NameError: name f is not defined
[Errno 2] No such file or directory: d:/a.txt
return语句和异常处理问题
由于return有两种作用结束方法运行、返回值。我们一般不把return放到异常处理结构中而是放到方法最后。
【示例】return和异常结构的正确处理方式
def test01():print(step1)try:x 3/0# return aexcept:print(step2)print(异常0不能做除数)#return bfinally:print(step4)#return dprint(step5)return e #一般不要将return语句放到try、except、else、finally块中会发生一些意想不到的错误。建议放到方法最后。
print(test01())执行结果
step1
step2
异常0不能做除数
step4
step5
e
常见异常汇总
常见异常的解决
Python中的异常都派生自BaseException类本节我们测试和列出常见的一些异常方便初学者掌握。
SyntaxError语法错误 int a 3 ^
SyntaxError: invalid syntaxNameError尝试访问一个没有申明的变量 print(a)
NameError: name a is not definedZeroDivisionError除数为0错误零除错误 a 3/0
ZeroDivisionError: division by zeroValueError数值错误 float(gaoqi)
ValueError: could not convert string to float: gaoqiTypeError类型错误 123abc
TypeError: unsupported operand type(s) for : int and strAttributeError访问对象的不存在的属性
a100
a.sayhi()
AttributeError: int object has no attribute sayhiIndexError索引越界异常
a [4,5,6]
a[10]
IndexError: list index out of rangeKeyError字典的关键字不存在
a {name:gaoqi,age:18}
a[salary]
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解释器请求退出TabErrorTab 和空格混用TypeError对类型无效的操作UnboundLocalError访问未初始化的本地变量UnicodeDecodeErrorUnicode 解码时的错误UnicodeEncodeErrorUnicode 编码时错误UnicodeErrorUnicode 相关的错误UnicodeTranslateErrorUnicode 转换时错误UserWarning用户代码生成的警告ValueError传入无效的参数Warning警告的基类WindowsError系统调用失败ZeroDivisionError除(或取模)零 (所有数据类型) with上下文管理资源
finally块由于是否发生异常都会执行通常我们放释放资源的代码。其实我们可以通过with上下文管理更方便的实现释放资源的操作。
with上下文管理的语法结构如下
with context_expr [ as var]语句块with上下文管理可以自动管理资源在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块不论是否有异常总能保证资源正常释放。极大的简化了工作在文件操作、网络通信相关的场合非常常用。
【示例】with上下文管理文件操作
with open(d:/bb.txt) as f:for line in f:print(line)运行结果就是你在D盘的bb.txt文件里面的东西注意中文会乱码。下面的代码查找就不会乱码。
with open(d:/bb.txt, encodingutf-8) as f:for line in f:print(line)traceback模块和生成异常日志
【示例】使用traceback模块打印异常信息
import traceback
try:print(step1)num 1/0
except:traceback.print_exc()
运行结果
import traceback
try:print(step1)num 1/0
except:traceback.print_exc()
自定义异常类
程序开发中有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常通常继承Exception或其子类即可。命名一般以Error、Exception为后缀。
自定义异常由raise语句主动抛出。
【示例】自定义异常类和raise语句
#测试自定义异常类
class AgeError(Exception): #继承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)self.errorInfo errorInfodef __str__(self):return str(self.errorInfo),年龄错误应该在1-150之间
############测试代码################
if __name__ __main__: #如果为True则模块是作为独立文件运行可以执行测试代码age int(input(输入一个年龄:))if age1 or age150:raise AgeError(age)else:print(正常的年龄,age)输入一个年龄:200
Traceback (most recent call last):File C:\Users\26648\PycharmProjects\pythonProject1\main.py, line 12, in moduleraise AgeError(age)
AgeError: 200,年龄错误应该在1-150之间
自定义异常类一般都是运行时异常通常继承Exception或其子类即可。命名一般以Error、Exception为后缀。
自定义异常由raise语句主动抛出。
pycharm调试模式_debug视图
进行调试的核心是设置断点。程序执行到断点时暂时挂起停止执行。就像看视频按下停止一样我们可以详细的观看停止处的每一个细节。
断点
程序运行到此处暂时挂起停止执行。我们可以详细在此时观察程序的运行情况方便做出进一步的判断。 设置断点 在行号后面单击即可增加断点。在断点上再单击即可取消断点。
进入调试视图
我们通过如下三种方式都可以进入调试视图 单击工具栏上的按钮 右键单击编辑区点击debug ‘模块名’ 快捷键shiftF9
进入调试视图后布局如下 左侧为“浏览帧” 调试器列出断点处当前线程正在运行的方法每个方法对应一个“栈帧”。最上面的是当前断点所处的方法。 变量值观察区 调试器列出了断点处所在方法相关的变量值。我们可以通过它查看变量的值的变化。
我们通过上图中的按钮进行调试操作它们的含义如下
中文名称英文名称图标说明单步调试遇到函数跳过step over若当前执行的是一个函数则会把这个函数当做整体一步执行完。不会进入这个函数内部单步调试遇到函数进入step into若当前执行的是一个函数则会进入这个函数内部跳出函数step out当单步执行到子函数内时用step out就可以执行完子函数余下部分并返回到上一层函数执行的光标处run to cursor一直执行到光标处停止用在循环内部时点击一次就执行一个循环