异常和错误
1、语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
SyntaxError: invalid syntax
2、逻辑错误(逻辑错误)
python中的异常种类
1、常见异常
1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异常;基本上是无法打开文件 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误 4 IndentationError 语法错误(的子类) ;代码没有正确对齐 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] 6 KeyError 试图访问字典里不存在的键 7 KeyboardInterrupt Ctrl+C被按下 8 NameError 使用一个还未被赋予对象的变量 9 TypeError 传入对象类型与要求的不符合 10 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 11 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
2、更多异常
1 ArithmeticError :所有数值计算错误的基类 2 AssertionError:断言语句失败 3 AttributeError:对象没有这个属性 4 BaseException:所有异常的基类 5 BufferError:当无法执行缓冲区相关操作时引发 6 BytesWarning:对于字节和字节数组警告相关的基类 7 DeprecationWarning:关于被弃用的特征的警告 8 EnvironmentError :操作系统错误的基类 9 EOFError :没有内建输入,到达EOF 标记 10 Exception:常规错误的基类 11 FloatingPointError :浮点计算错误 12 FutureWarning :关于构造将来语义会有改变的警告 13 GeneratorExit :生成器(generator)发生异常来通知退出 14 ImportError :导入模块/对象失败 15 IndentationError:缩进错误 16 IndexError:序列中没有此索引(index) 17 IOError :输入/输出操作失败 18 KeyboardInterrupt:用户中断执行(通常是输入^C) 19 KeyError:映射中没有这个键 20 LookupError :无效数据查询的基类 21 MemoryError:内存溢出错误(对于Python 解释器不是致命的) 22 NameError:未声明/初始化对象 (没有属性) 23 NotImplementedError:尚未实现的方法 24 OSError :操作系统错误 25 OverflowError:数值运算超出最大限制 26 OverflowWarning:旧的关于自动提升为长整型(long)的警告 27 PendingDeprecationWarning:关于特性将会被废弃的警告 28 ReferenceError:弱引用(Weak reference)试图访问已经垃圾回收了的对象 29 RuntimeError :一般的运行时错误 30 RuntimeWarning :可疑的运行时行为(runtime behavior)的警告 31 StandardError:所有的内建标准异常的基类 32 StopIteration :迭代器没有更多的值 33 SyntaxError:Python 语法错误 34 SyntaxWarning:可疑的语法的警告 35 SystemError :一般的解释器系统错误 36 SystemExit:解释器请求退出 37 TabError:Tab 和空格混用 38 TypeError:对类型无效的操作 39 UnboundLocalError :访问未初始化的本地变量 40 UnicodeDecodeError :Unicode 解码时的错误 41 UnicodeEncodeError :Unicode 编码时错误 42 UnicodeError :Unicode 相关的错误 43 UnicodeTranslateError:Unicode 转换时错误 44 UserWarning:用户代码生成的警告 45 ValueError :传入无效的参数 46 Warning :警告的基类 47 WindowsError:系统调用失败 48 ZeroDivisionError:除(或取模)零 (所有数据类型)
3、异常的结构
1 BaseException 2 +-- SystemExit 3 +-- KeyboardInterrupt 4 +-- GeneratorExit 5 +-- Exception 6 +-- StopIteration 7 +-- StandardError 8 | +-- BufferError 9 | +-- ArithmeticError 10 | | +-- FloatingPointError 11 | | +-- OverflowError 12 | | +-- ZeroDivisionError 13 | +-- AssertionError 14 | +-- AttributeError 15 | +-- EnvironmentError 16 | | +-- IOError 17 | | +-- OSError 18 | | +-- WindowsError (Windows) 19 | | +-- VMSError (VMS) 20 | +-- EOFError 21 | +-- ImportError 22 | +-- LookupError 23 | | +-- IndexError 24 | | +-- KeyError 25 | +-- MemoryError 26 | +-- NameError 27 | | +-- UnboundLocalError 28 | +-- ReferenceError 29 | +-- RuntimeError 30 | | +-- NotImplementedError 31 | +-- SyntaxError 32 | | +-- IndentationError 33 | | +-- TabError 34 | +-- SystemError 35 | +-- TypeError 36 | +-- ValueError 37 | +-- UnicodeError 38 | +-- UnicodeDecodeError 39 | +-- UnicodeEncodeError 40 | +-- UnicodeTranslateError 41 +-- Warning 42 +-- DeprecationWarning 43 +-- PendingDeprecationWarning 44 +-- RuntimeWarning 45 +-- SyntaxWarning 46 +-- UserWarning 47 +-- FutureWarning 48 +-- ImportWarning 49 +-- UnicodeWarning 50 +-- BytesWarning
三、异常处理
1、异常的特点:异常发生之后,异常之后的代码就不执行了
2、什么是异常处理
python解释器检测到错误,触发异常(也允许程序员自己触发异常),程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
3、异常处理的意义
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性。
4、★异常处理方法:
①使用if进行异常处理
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
②python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
- part1:基本语法
try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
- part2:异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
# 未捕获到异常,程序直接报错 s1 = ‘hello‘ try: int(s1) except IndexError as e: print e
- part3:多分支
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e)
- part4:万能异常 在python的异常中,有一个万能异常:Exception,可以捕获任意异常
s1 = ‘hello‘ try: int(s1) except Exception as e: print(e)
- part5:异常的其他语法
s1 = ‘hello‘ try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #except Exception as e: # print(e) else: print(‘try内代码块没有异常则执行我‘) finally: print(‘无论异常与否,都会执行该模块,通常是进行清理工作‘)
- part6:主动触发异常
try: raise TypeError(‘类型错误‘) except Exception as e: print(e)
- part7:自定义异常
class YangException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise YangException(‘类型错误‘) except YangException as e: print(e)
- part8:断言
# assert 条件 assert 1 == 1 assert 1 == 2
- part9:try..except的方式比较if的方式的好处
把错误处理和真正的工作分开来
代码更易组织,更清晰,复杂的工作任务更容易实现;
毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;