5-2python语法基础-异常操作
############### python-异常的操作 ###############
# 异常:python解释器遇到一个错误,会停止程序的执行,并且提示错误信息,这就是异常, # 抛出异常:python停止程序,提示错误,这就是抛出异常 # 捕获异常: # 捕获异常的语法: # try: # 尝试执行的代码 # except: # 出现错误的处理 try: num=int(input('请输入一个整数:')) except: print('请输入正确的整数') print('------------') # 无论上面的代码是否有错误,都会执行下面的代码, # 错误类型捕获 # 抛出的异常可能是不同类型的错误,我们需要对不同的错误类型,做出不同的响应, # 在python抛出异常的最后一行的第一个单词就是捕获的错误类型, # 捕获错误类型的语法: # try: # 尝试执行的代码 # except 错误类型1: # 出现错误的处理 # except (错误类型2,错误类型3): # 出现多个错误的处理 # except Exception as result:# 捕获未知错误,未知错误就是没有预判到的错误,这是非常固定的语法!! # print('未知错误%s'%result) try: num=int(input('请输入一个整数')) result=8/num print(result) except ZeroDivisionError: print('输入不能是0') except ValueError: print('输入必须是整数') except Exception as result: print('未知错误%s'%result) # 总结: # 捕获异常的完整语法: # try: # 尝试执行的代码 # except 错误类型1: # 出现错误的处理 # except (错误类型2,错误类型3): # 出现多个错误的处理 # except Exception as result:# 捕获未知错误,未知错误就是没有预判到的错误,这是非常固定的语法!! # print('未知错误%s'%result) # else: # 没有异常才会执行的代码 # finally: # 不管有没有异常都会执行的代码
############### 常见异常 ###############
""" AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 """
############### 主动触发异常 ###############
try: raise TypeError('类型错误') except Exception as e: print(e)
############### 自定义异常 ###############
class xxxException(BaseException): def __init__(self,msg): self.msg = msg def __str__(self): return self.msg try: raise xxxException("123") except xxxException as e: print(e) # 第二种方式 def func(): try: for i in range(5): if i > 2: raise Exception("数字大于2了") except Exception as e: print(e) func()
##############################################
打印更加丰富的异常信息
代码
import traceback try: a = 1/0 except Exception as e: print('str(e):\t', e) print('repr(e):\t', repr(e)) print('traceback.format_exc():\n%s' % traceback.format_exc()) #字符串 traceback.print_exc() #执行函数
输出:
str(e): division by zero repr(e): ZeroDivisionError('division by zero') traceback.format_exc(): Traceback (most recent call last): File "/Users/ace/Play/test/异常信息.py", line 4, in <module> a = 1/0 ZeroDivisionError: division by zero Traceback (most recent call last): File "/Users/ace/Play/test/异常信息.py", line 4, in <module> a = 1/0 ZeroDivisionError: division by zero
traceback.format_exc()和traceback.print_exc()都可以打印完整的错误信息
traceback.format_exc()返回值为字符串
traceback.print_exc()是一个执行函数,直接在控制台打印错误信息
######
技术改变命运