异常是错误发生的信号,一旦程序出错就会产生一个异常,
如果该异常没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止。
异常包含三个部分:
- traceback异常的追踪信息
- 异常的类型
- 异常的信息
错误分为两大类:
1.语法上的错误:在程序运行前就应该立即修正
2.逻辑上的错误
二、为何要异常处理
避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
三、如何异常处理
try: #try监听下面的代码块 代码1 代码2 代码3 ...... except NameError: 当抛出的异常时 NameError时执行的子代码块
# 异常处理: try: print('====>1') print('====>2') print('====>3') l = [1,2,3] l[100] #IndexError #运行到此处直接跳到except下的代码块 print('====>4') #不执行 except IndexError: print('IndexError')
#异常处理多分支 try: print('====>1') print('====>2') print('====>3') l = [1,2,3] d = {'x':1,'y':2} d['z'] #KeyError l[100] #IndexError #运行到此处直接跳到except下的代码块 print('====>4') #不执行 except IndexError: print('IndexError') except KeyError: print('KeyError') print('other code')
try: print('====>1') print('====>2') print('====>3') l = [1,2,3] d = {'x':1,'y':2} # d['z'] #KeyError # l[100] #IndexError print('====>4') #不执行 except (KeyError,IndexError) as e: #(KeyError,IndexError)捕捉其中一种异常 print(e)
万能异常类型 Exception :可以捕捉任意类型的异常
try: print('====>1') print('====>2') print('====>3') l = [1,2,3] d = {'x':1,'y':2} d['z'] #KeyError l[100] #IndexError print('====>4') #不执行 except Exception as e: # as 给异常起别名 print(e) print('other code')
try + else...: else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行
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 + finally... :无论finally前面被检测的代码有没有异常都会执行
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('我自定义的异常')