用到的
else --------------- else的子代码块会在被检测的代码没有异常情况下执行,else必须放在后面
finally ------------- 无论被检测的代码有没有异常都会执行
raise -------------- 主动触发异常
assert ------------ 断言
常用异常
Exception -------- 万能异常类型
AttributeError ------------- 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError --------------------- 输入/输出异常;基本上是无法打开文件ImportError --------------- 无法引入模块或包;基本上是路径问题或名称错误IndentationError --------- 语法错误(的子类) ;代码没有正确对齐IndexError ---------------- 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError ------------------ 试图访问字典里不存在的键KeyboardInterrupt ------ Ctrl+C被按下NameError --------------- 使用一个还未被赋予对象的变量SyntaxError -------------- Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError ----------------- 传入对象类型与要求的不符合UnboundLocalError ---- 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError ---------------- 传入一个调用者不期望的值,即使值的类型是正确的![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
异常处理
异常是错误发生的信号, 一旦程序出错就会产生一个异常, 如果该异常没有被应用程序处理, 那么该异常就会抛出来, 程序的执行也随之终止
异常包含三个部分:
1. traceback异常的追踪信息
2. 异常的类型
3. 异常的信息
错误分为两大类:
1. 语法上的错误: 在程序运行前就应该立即修正
2. 逻辑上的错误
用异常处理是避免程序因为异常而奔溃, 所以在应用程序中应该对异常进行处理, 从而增强程序的健壮性
自定义处理异常结构:
1) try: except Exception as e:2) try: except Exception: else:3) try: except Exception: else: finally:4) try: except...5) try: finally:
例子:
1 try: 2 代码1 3 代码2 4 代码3 5 ........ 6 except NameError: 7 当抛出的异常是NameError时执行的子代码块 8 except ....: 9 pass10 except ....:11 pass12 else: #else必须放到后面, else的子代码块会在被检测的代码没有异常的情况下执行 13 pass14 finally: #无论被检测的代码有没有异常都会执行15 pass
异常处理的单分支
1 try: 2 print('=====1') 3 print('=====2') 4 print('=====3') 5 d = { 'x': 1, 'y': 2} 6 d['z'] # KeyError 7 print('=====4') 8 l = [1, 2, 3] 9 l[1000] # IndexError10 print('=====5')11 except IndexError:12 print('IndexError')13 14 print('other code')
异常处理的多分支
1 try: 2 print('=====1') 3 print('=====2') 4 print('=====3') 5 d = { 'x': 1, 'y': 2} 6 d['z'] # KeyError 7 print('=====4') 8 l = [1, 2, 3] 9 l[1000] # IndexError10 print('=====5')11 except IndexError:12 print('IndexError')13 14 print('other code')
万能异常类型Exception: 可以匹配任意类型的异常
1 try: 2 print('=====1') 3 print('=====2') 4 print('=====3') 5 d = { 'x': 1, 'y': 2} 6 # d['z'] # KeyError 7 # xxx 8 print('=====4') 9 l = [1, 2, 3]10 l[1000] # IndexError11 print('=====5')12 except IndexError as e:13 print('IndexError:', e)14 except KeyError as e:15 print('KeyError:', e)16 except Exception as e:17 print('Exception:', e)18 19 print('other code')
主动触发异常
1 class People: 2 def __init__(self, name, age): 3 self.__name = name 4 self.__age = age 5 6 def tell_info(self): 7 print(self.__name, self.__age) 8 9 def set_info(self, name, age):10 if not isinstance(name, str):11 raise TypeError('名字必须是str类型')12 if not isinstance(age, int):13 raise TypeError('年龄必须是int类型')14 self.__name = name15 self.__age = age16 17 18 obj = People('egon', 18)19 obj.set_info('egon', 123)20 obj.tell_info()
自定义异常类型(了解):
继承BaseException即可自定义异常类型
1 class MyException(BaseException): 2 def __init__(self, msg): 3 super().__init__() 4 self.msg = msg 5 6 def __str__(self): 7 return '<%s>' % self.msg 8 9 10 raise MyException('我自定义的异常')
断言(了解)
1 print('上半部分,生产数据')2 l=[1,2,3,4,]3 4 if len(l) != 5:5 raise TypeError('列表的长度必须为5')6 assert len(l) == 57 8 print('下半部分,处理数据')