明党参

首页 » 常识 » 常识 » Python入门异常处理
TUhjnbcbe - 2021/7/7 1:31:00
北京皮炎医院地图 http://baidianfeng.39.net/a_cjzz/210122/8615677.html
1.引言

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异常时,后面的代码将不会执行。

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: Python入门异常处理