Python程序的执行流程可分为:按顺序执行、按条件执行、重复执行。不管怎么执行,前提是代码运行不能出错,如果运行错误需要进行异常处理(exceptionhanding)。处理异常首先得知道程序出现什么错误,才能对症下药,精准实施。
2.错误类型程序中的错误(Error)又称之为Bug,大致可分为以下三类:
语法错误(SyntaxError)
运行错误(RuntimeError)
逻辑错误(LogicalError)
2.1语法错误所谓语法错误就是编写的程序没有遵循语言的编程规则,在程序执行时编译报错。对于Python语言初学者比较常见。语法错误的常见类型如下:
关键字写成
if、else、while、for、def、class、try等语句最后没有冒号(:)或冒号后面的语句块没有缩进
字符串只有单边引号
中文格式下的括号、逗号、冒号等
等等。
2.2运行错误运行错误就是在程序运行时报错,这种错误在编写代码中不太容易识别,只有程序执行时才知道那里出错。运行出错常见的类型如下:
变量没有定义
不同数据类型相加
调用函数时必选参数不传
读取的文件不存在
等等。
2.3逻辑错误逻辑错误的程序执行时不会报错,只是程序运行的结果不是自己想要的。这种错误很难识别。如:
用错变量名
用错操作符优先级
用错布尔值
缩进不该缩进的代码
等等。
3.具体错误Python程序中出现的具体错误我们称之为标准异常(StandardException),如下表所示:
Exception说明AssertionError断言语句(assert)失败AttributeError尝试访问未知的对象属性EOFError用户输入文件末尾标志EOF(Ctrl+d)FloatingPointError浮点计算错误GeneratorExitgenerator.close()方法被调用的时候ImportError导入模块失败的时候IndexError索引超出序列的范围KeyError字典中查找一个不存在的关键字KeyboardInterrupt用户输入中断键(Ctrl+c)MemoryError内存溢出(可通过删除对象释放内存)NameError尝试访问一个不存在的变量NotImplementedError尚未实现的方法OSError操作系统产生的异常(例如打开一个不存在的文件)OverflowError数值运算超出最大限制ReferenceError弱引用(weakreference)试图访问一个已经被垃圾回收机制回收了的对象RuntimeError一般的运行时错误StopIteration迭代器没有更多的值SyntaxErrorPython的语法错误IndentationError缩进错误TabErrorTab和空格混合使用SystemErrorPython编译器系统错误SystemExitPython编译器进程被关闭TypeError不同类型间的无效操作UnboundLocalError访问一个未初始化的本地变量(NameError的子类)UnicodeErrorUnicode相关的错误(ValueError的子类)UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)UnicodeTranslateErrorUnicode转换时的错误(UnicodeError的子类)ValueError传入无效的参数ZeroDivisionError除数为零4.异常处理异常处理的结构包含如下:
try-except
try-except-else
try-except-else-finally
raiseException
4.1try-except异常处理常见的结构为try-except组合,该组合结构又可分为如下形式:
try-exceptException:知道错误但不确定类型
try-exceptstandard_exception:知道错误且确定类型
使用多个except
4.1.1知道错误但不确定类型1try:2#要运行的代码3except:4#程序异常待处理的代码
1defdivide(a,b):2try:3c=a/b4print("result={:.2f}".format(c))5except:6print("Divisoriszeroanddivisionisimpossible!")
我们知道分母b不能为0,当b=0时出现异常,便处理except内的代码
divide(2,0)
Divisoriszeroanddivisionisimpossible!
1try:2#要运行的代码3exceptExceptionase:#自动捕获异常,并给异常起个名字e4print(e)
1defdivide(a,b):2try:3c=a/b4print("result={:.2f}".format(c))5exceptExceptionase:6print(e)
divide(5,0)
divisionbyzero4.1.2知道错误且确定类型
1try:2#要运行的代码3exceptstandard_exception:4#程序异常待处理的代码
通过上述例子我们知道divide(5,0)的标准异常是ZeroDivisionError,这样可以显性地在except后面写上标准异常
1defdivide(a,b):2try:3c=a/b4print("result={:.2f}".format(c))5exceptZeroDivisionError:6print("Divisoriszeroanddivisionisimpossible!")
divide(5,0)
Divisoriszeroanddivisionisimpossible!4.1.3使用多个except
1try:2#要运行的代码3exceptstandard_exception1:4#程序异常待处理的代码15exceptstandard_exception2:6#程序异常待处理的代码27...
假设你预期代码会出现ZeroDivisionError和NameError的异常错误,你可以使用多个except语句来实现
1defdivide(a,b):2try:3c=a/b4d=c1+15print("result={:.2f}".format(c))6exceptZeroDivisionError:7print("Divisoriszeroanddivisionisimpossible!")8exceptNameError:9print("somevariableisnotdefined")
当b=0时,捕获ZeroDivisionError异常错误
divide(5,0)
Divisoriszeroanddivisionisimpossible!
当c1没有声明时,捕获NameError异常错误
1divide(5,1)
1somevariableisnotdefined4.2try-except-else
上节讲到将要执行的程序放在try内,而当程序出现异常时执行except内的程序。当程序没有异常时,可以加一个else语句,这就是try-except-else组合结构。
1try:2#执行程序3except:4#异常处理程序5else:6#执行程序无异常处理程序
当然,else语句是可有可无的。如果存在,则else语句应放在except的后面。else语句可作为一种程序正常执行的提示。
当try内的代码执行无误时,才会执行else内的代码
当try内的代码执行异常时,except语句处理异常,else内的代码不会执行
1defdivide(a,b):2try:3c=a/b4print("result={:.2f}".format(c))5exceptZeroDivisionError:6print("Divisoriszeroanddivisionisimpossible!")7else:8print("程序无异常!")
divide(5,0)
Divisoriszeroanddivisionisimpossible!
divide(5,1)
result=5.00程序无异常!4.3try-except-else-finally
在try-except-else结构的后面加finally语句,该语句不管前面的代码执行是否有异常,finally内的代码都会执行
1try:2#执行程序3except:4#异常处理程序5else:6#执行程序无异常处理程序7finally:8#不管执行程序有无异常都会执行
1defdivide(a,b):2try:3c=a/b4print("result={:.2f}".format(c))5exceptZeroDivisionError:6print("Divisoriszeroanddivisionisimpossible!")7else:8print("程序无异常!")9finally:10print("有误异常我都要执行!")
divide(5,0)
Divisoriszeroanddivisionisimpossible!有误异常我都要执行!
divide(5,1)
result=5.00程序无异常!有误异常我都要执行!4.4raiseException
raise可以显示地抛出异常,一旦执行了raise语句,raise后面的代码将不会执行。
1try:2s=None3ifsisNone:4print("s是空对象")5#raiseNameError#如果引发NameError异常,后面的代码将不能执行6print(len(s))7exceptTypeError:8print("空对象没有长度")
s是空对象空对象没有长度
1try:2s=None3ifsisNone:45print("s是空对象")6raiseNameError#如果引发NameError异常,后面的代码将不能执行7print(len(s))8exceptTypeError:9print("空对象没有长度")
当raise抛出NameError异常时,后面的代码将不会执行。
预览时标签不可点收录于话题#个上一篇下一篇