# -*- coding: utf-8 -*- """ 什么是异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常, 如果该异常没有被应用程序处理,那么该异常就会被抛出来,程序的执行也会随之终止 异常包含三个部分: 1.traceback 异常的追踪信息 2.异常的类型 3.异常的信息 为什么处理异常: 避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性 错误分为两大类: 1.语法错误 2.逻辑上的错误 常见的异常类型: TypeError:类型错误 IndexError:索引错误 AttrbuiteError:属性错误 等 3 如何处理异常: try: 代码1 代码2 ..... except NameError: 如果异常执行的代码块 """ try: ls = [1, 2, 3, 4] print(ls[10]) except IndexError: print('索引错误') print('else code') # 索引错误 # else code age = input(">>:").strip() if age > 10: print(age) # TypeError: '>' not supported between instances of 'str' and 'int' import os os.xxx # AttributeError: module 'os' has no attribute 'xxx' # 异常处理的多分支 try: print('1============') print('2=============') d = {'x': 1, 'y': 2} # KeyError print(d['z']) print('3===========') ls = [1, 2, 3, 4] print(ls[10]) print('4==========') except IndexError as e: # 其别名接收异常的值 print('IndexError') except KeyError as e: print('KeyError', e) # KeyError 'z' print('else code') # 1============ # 2============= # KeyError # # else code """ 万能异常类型: 特点---可以匹配任意类型的异常 一般用于不管发什么异常,都用统一的代码块 比如 针对 keyerror 用一段处理逻辑 针对 indexerror 用一段处理逻辑 其他异常 统一用一段处理逻辑 """ try: print('1============') print('2=============') d = {'x': 1, 'y': 2} # KeyError print(d['z']) print('3===========') ls = [1, 2, 3, 4] print(ls[10]) print('4==========') except IndexError as e: # 其别名接收异常的值 print('IndexError') except Exception as e: print('Exception', e) # Exception 'z' print('else code') """ try: exception: else: """ try: print('1============') print('2=============') d = {'x': 1, 'y': 2} # KeyError # print(d['z']) print('3===========') ls = [1, 2, 3, 4] # print(ls[10]) print('4==========') except IndexError as e: # 其别名接收异常的值 print('IndexError') except Exception as e: print('Exception', e) # Exception 'z' print('else code') else: print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行') # 1============ # 2============= # 3=========== # 4========== # else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行 """ finally:无论被检测的代码块是否异常,都会运行 """ try: print('1============') print('2=============') d = {'x': 1, 'y': 2} # KeyError print(d['z']) print('3===========') ls = [1, 2, 3, 4] print(ls[10]) print('4==========') except IndexError as e: # 其别名接收异常的值 print('IndexError') except Exception as e: print('Exception', e) # Exception 'z' print('else code') else: print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行') finally: print('无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收') # 1============ # 2============= # Exception 'z' # else code # 无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收 """ 自定义自己的异常类 """ # 主动触发异常: # raise # print('1') # raise TypeError('类型错误') class MyException(BaseException): def __init__(self, msg): super().__init__() self.msg = msg def __str__(self): return '<%s>' % self.msg # raise MyException('我是自定义异常') # __main__.MyException: <我是自定义异常> # raise 抛异常 class People: def __init__(self, name, age): self.__age = age self.__name = name def tell_info(self): print(self.__name, self.__age) def set_info(self, name, age): if not isinstance(name, str): raise TypeError('请传入字符串类型名字') if not isinstance(age, int): raise TypeError('请传入数字类型') else: self.__name = name self.__age = age # obj = People('qzk', 18) # obj.set_info(199, 'qqq') # raise TypeError('请传入字符串类型名字') """ 断言 """ # 基本原理 print('上半部分程序产生的数据') l = [1, 2, 3, 4] if len(l) != 5: raise Exception('列表长度必须为5') print('下半部分处理程序') # raise Exception('列表长度必须为5') # Exception: 列表长度必须为5 print('上半部分程序产生的数据') l = [1, 2, 3, 4] assert len(l) == 5 print('下半部分处理程序') # 上半部分程序产生的数据 # Traceback (most recent call last): # File "E:/异常处理.py", line 222, in <module> # assert len(l) == 5 # AssertionError
转载于:https://www.cnblogs.com/qianzhengkai/p/10787112.html