异常处理
一、什么是异常
''' 异常就是程序运行时发生的错误信号,(在程序出现错误时,则会产生一个异常,若程序没处理它,则会抛出异常,程序的运行也会随之终止) 异常分为两种: 语法错误:这种错误必须在程序运行前就得改正 逻辑错误: 1、如果能够预知错误发生的条件,应该使用if判断去预防 2、如果无法预知错误发生的条件,即错误可能会发生,应该是使用try....except进行补救 '''
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError 所有数值计算错误的基类 FloatingPointError 浮点计算错误 OverflowError 数值运算超出最大限制 ZeroDivisionError 除(或取模)零 (所有数据类型) AssertionError 断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败 OSError 操作系统错误 WindowsError 系统调用失败 ImportError 导入模块/对象失败 LookupError 无效数据查询的基类 IndexError 序列中没有此索引(index) KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命的) NameError 未声明/初始化对象 (没有属性) UnboundLocalError 访问未初始化的本地变量 ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象 RuntimeError 一般的运行时错误 NotImplementedError 尚未实现的方法 SyntaxError Python 语法错误 IndentationError 缩进错误 TabError Tab 和空格混用 SystemError 一般的解释器系统错误 TypeError 对类型无效的操作 ValueError 传入无效的参数 UnicodeError Unicode 相关的错误 UnicodeDecodeError Unicode 解码时的错误 UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning 关于被弃用的特征的警告 FutureWarning 关于构造将来语义会有改变的警告 OverflowWarning 旧的关于自动提升为长整型(long)的警告 PendingDeprecationWarning 关于特性将会被废弃的警告 RuntimeWarning 可疑的运行时行为(runtime behavior)的警告 SyntaxWarning 可疑的语法的警告 UserWarning 用户代码生成的警告
二、如何处理异常
''' 为了增强程序的健壮性,我们有必要对可能发生的异常进行处理 '''
1、单分支
try: # 被检测代码 age # 一旦被检测代码抛出异常,则此代码的下面的代码则不会执行 print('hello world') except NameError as e: # 异常类型 e是异常的值 print('程序异常了:', e) # try中一旦检测到异常,就执行此处的逻辑
2、多分支
s1 = 'Linux' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e)
3、万能异常捕获Exception
s1='Linux' try: int(s1) except Exception as e: print(e)
4、else(被检测的代码无异常抛出,才会执行)
try: age=20 except Exception as e: print(e) else: # 被检测的代码,没异常抛出,不能单独存在 print('try里的代码没问题') # 被检测代码无异常抛出,则执行此逻辑
5、 finally(被检测代码无论有无异常抛出,都会执行)
try: age=20 finally: # 无论被检测代码有无异常抛出,都会执行 可单独存在 print('资源回收') # 常用与资源回收
6、主动抛出异常raise
class UserInfo: def __init__(self,name,age): self.__name=name self.__age=age def get(self): print('<姓名: %s 年龄: %s>' %(self.__name,self.__age)) def set(self,name,age): if not isinstance(name,str): raise TypeError('姓名必须是str类型') if not isinstance(age,int): raise TypeError('年龄必须是int类型') self.__name=name self.__age=age
userinfo=UserInfo('fred',20) userinfo.get() # 处理主动抛出的异常 try: userinfo.set(10,10) except TypeError as e: print(e)
7、自定义异常
class MyExpect(BaseException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg try: raise MyExpect('TypeError') except MyExpect as e: print(e)
三、异常处理总结
''' 多分支异常与万能异常: 如果想要无论出现什么异常,都是用同一逻辑处理,Exception是上上之选 如果想要对于不同异常定制不同的处理逻辑,那就需要用到多分支 加上异常处理的逻辑 1、把错误处理和真正的工作分开来 2、代码更易组织,更清晰,复杂的工作任务更容易实现 3、代码健壮性提高了,不至于由于一些小的疏忽而使程序意外崩溃了
try....except加的越多,代码的可读性越差,所以打铁还需自身硬,好好提高开发能力吧 '''
转载请注明出处:http://www.cnblogs.com/lichunke/