异常处理
1 什么是异常处理:
异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常
没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止
异常包含三个部分:
1. traceback异常的追踪信息
2. 异常的类型
3. 异常的信息
错误分为两大类:
1. 语法上的错误:在程序运行前就应该立即修正
2. 逻辑上的错误
2. 为何要异常处理
避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
3.如何异常处理
try: 代码1 代码2 代码3 ...... except NameError: 当抛出的异常是NameError时执行的子代码块 except ....: pass except ...: pass else: pass finally: pass

print('adsfsadf') age=input('>>: ').strip() print(age > 10) #TypeError for i in 10: #TypeError pass import os os.xxx #AttributeError 1 / 0 #ZeroDivisionError: print('=====1') print('=====2') print('=====3') l=[1,2,3] l[1000] #IndexError print('=====4') d={'x':1,'y':2} d['z'] #KeyError print('=====5')

try: print('=====1') print('=====2') print('=====3') d = {'x': 1, 'y': 2} d['z'] # KeyError print('=====4') l = [1, 2, 3] l[1000] # IndexError print('=====5') except IndexError: print('IndexError') print('other code')

try: print('=====1') print('=====2') print('=====3') d = {'x': 1, 'y': 2} d['z'] # KeyError print('=====4') l = [1, 2, 3] l[1000] # IndexError print('=====5') except KeyError as e: print('KeyError',e) except IndexError as e: print('IndexError',e) print('other code')

try: print('=====1') print('=====2') print('=====3') d = {'x': 1, 'y': 2} # d['z'] # KeyError # xxx print('=====4') l = [1, 2, 3] l[1000] # IndexError print('=====5') except IndexError as e: print('IndexError:', e) except KeyError as e: print('KeyError:', e) except Exception as e: print('Exception:',e) print('other code')

try: print('=====1') print('=====2') print('=====3') d = {'x': 1, 'y': 2} # d['z'] # KeyError # xxx print('=====4') l = [1, 2, 3] # l[1000] # IndexError print('=====5') except IndexError as e: print('IndexError:', e) except KeyError as e: print('KeyError:', e) except Exception as e: print('Exception:',e) else: print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行') # print('other code')

try: f=open('a.txt','w') print('=====1') print('=====2') print('=====3') d = {'x': 1, 'y': 2} # d['z'] # KeyError # xxx 'xx' > 10 print('=====4') l = [1, 2, 3] # l[1000] # IndexError print('=====5') except IndexError as e: print('IndexError:', e) except KeyError as e: print('KeyError:', e) # except Exception as e: # print('Exception:',e) else: print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行') finally: print('无论被检测的代码有没有异常都会执行') f.close()

print('===>1') print('===>2') raise TypeError('类型错误') print('===>3') class People: def __init__(self,name,age): self.__name=name self.__age=age def tell_info(self): print(self.__name,self.__age) def set_info(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 obj=People('egon',18) # print(obj.__dict__) # obj.tell_info() obj.set_info('egon',123) obj.tell_info()
# 自定义异常类型(了解) class MyException(BaseException): def __init__(self,msg): super().__init__() self.msg=msg def __str__(self): return '<%s>' %self.msg raise MyException('我自定义的异常') # 断言(了解) print('上半部分,生产数据') l=[1,2,3,4] # if len(l) != 5: # raise TypeError('列表的长度必须为5') assert len(l) == 5 print('下半部分,处理数据')