# -- coding: utf-8 --
# @Time : 2022/9/6 13:49
# @Author : siyu.yang
# @desc 第六章 python异常处理
# python 异常处理基本概念
# 异常处理:
# 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常
# 状况(即超出程序正常执行流程的某些特殊条件)如:文件找不到、网络连接失败、非法参数等。
# 异常是一个事件,它发生再程序运行期间,干扰了正常的指令流程。
# 一般情况下,在python无法正常处理程序时就会发生一个异常,异常时python对象,表示
# 一个错误,当python脚本呢发生异常时我们需要捕获处理它,或者程序会终止执行。
# 在python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有
# 异常都从基类Exception继承,而且都是exceptions模块中定义。Python 自动将所有异常放
# 在内建命名空间中,所以程序不必导入exception模块即可使用异常。
# 捕获异常可以使用try/except语句
# try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息处理。如果
# 你不想在异常发生时结束你的程序,只需要在try捕获它。
# python 异常处理基本实现
# 语法:
'''
try:
block
except [exception,[data....]]:
block
else:
block
# 异常处理:处理软件或信息系统中出现的异常情况
# 语法 try -- except -- else -- finally
list_a = ['a','b','c','d']
try: # try 下面方可能出错的代码
num = int(input('输入0-3之间的下标:'))
print(list_a[num])
# 对错误进行错误,让程序能够继续往后执行
except IndexError as e:
print('下标越界,错误信息是:',e)
print('系统默认输出list_a[0]的值',list_a[0])
except ValueError as e:
print('输入类型错误,错误信息是:',e)
print('系统默认输出list_a的值', list_a)
except Exception as e: #Exception 只能放在最后面
print('未知错误!')
else:
print('我是else:当try忠告没有错误的时候才会执行')
finally:
print('我是finally,无论怎样都执行')
print('看看看是否执行')
'''
# 该种异常处理语法的规则是:
# 执行try 下的语句,如果引发异常,则执行过程会跳到第一个except语句。
# 如果第一个except种定义的异常引发的异常匹配,则执行该except种的语句。
# 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except 数量没有限制。
# 如果所有的except都不匹配,则异常会传递到下一个调用本体代码的最高层try代码中。
# 如果没有发生异常,则执行else块代码。
# 举例:
'''
try:
f = open('C:\Users\kcadmin\Desktop\timesheet_aboutcg.txt','r')
except IOError as e:
print(e)
'''
# 解释:捕获到的IOError错误的详细原因会被放置在对象e中,然后运行该异常的except代码块
# 捕获所有的异常
# 使用except 子句需要注意的事情,就是多个except子句截获异常时,如果各个异常类
# 之间具有继承关系,则子类应该卸载前面,否则父类将会直接截获子类异常。放在后面的子类
# 也就不会执行到了。
# try - finally 语句:
# 无论是否发生异常都将执行最后的代码
'''
try:
block
finally:
block # 退出try时总会执行
'''
# 注意;else语句也不能与finally语句同时使用。举例:
'''
try:
f = open('C:\Users\kcadmin\Desktop\timesheet_aboutcg.txt','r')
try:
f.write('This is my test file for exception handing!!')
finally:
print('Going to close the file')
except IOError:
print("Error:can't find file or read data")
'''
# 触发异常:
# python 中的raise 关键字用于引发一个异常,语法格式如下:
# raise[Exception[,args[,traceback]]]
# 语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的
# 如果不提供,异常的casual就是"None"
# 举例:
'''
def ThrowErr():
raise Exception("抛出一个异常")
print("hello") # 爬出异常后语句不执行
try:
ThrowErr()
except Exception as x:
print(x)
'''
# 备注:当行数中的异常触发后,退出该函数,print语句将不执行
# 一个异常可以带上参数,可作为输出的异常信息参数,如 x,x 接收raise 抛出的错误信息。
# 变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。元组
# 通常包含错误字符串,错误数字,错误位置。
# python 自定义异常
# 通过创建一个新的异常类,程序可以命名他们自己的异常。异常应该是典型的继承自Exception
# 类,通过直接或间接的方式。自定义异常使用raise语句引发,而且只能通过人工方式触发。
# 举例:
'''
class DivisionException(Exception):
def __init__(self, x, y): # 调用基类的_ _init__进行初始化
Exception.__init__(self, x, y)
self.x = x
self.y = y
if __name__ == '__main__':
try:
x = 3
y = 2
if x % y > 0: # 如果大于0 ,则不能被初始化,抛出异常
print(x / y)
raise DivisionException(x, y)
except DivisionException as div: # div 表示DivisionException的实例对象
print("DivisionException:x/y = %.2f" % (div.x / div.y))
# 触发异常:由raise语句引起,只能由raise就会报错
# 异常分类:
# 1.系统异常:下标越界、类型错误、路径错误...
# 2.业务异常:充值金额只能在某个区间、密码错误、年龄范围
# raise 触发异常
try:
raise IndexError("我是下标越界异常") # 拆功能键一个IndexError异常,然后由raise触发
except IndexError as e:
print(e)
# 从键盘输入一个年龄,允许输入的范围在1-120之间
# 编写一个异常类
class input_1_120_Error(Exception):
def __str__(self):
return '输入的值不在1-120之间'
try:
age = int(input('请输入正确的年龄:'))
if age<1 or age > 120:
raise input_1_120_Error
else:
print('你输入的年龄为:',age)
except input_1_120_Error as e:
print('输入范围错误,错误信息是:',e)
print('系统设置默认年龄为:',age)
age = 20
except Exception as e:
print(e)
'''
# python 标准异常列表
# BaseException 所有异常的基类
# SystemExit 解释器请求退出
# KeyboardInterrupt 用户中断执行(通常是输入^C)
# Exception 常规错误的基类
# StopIteration 迭代器没有更多的值
# GeneratorExit 生成器(generator)发生异常来通知退出
# SystemExitPython 解释器请求退出
# StandardError 所有的内建标准异常的基类
# ArithmeticError 所有数值计算错误的基类
# FloatingPointError 浮点计算错误
# OverflowError 数值运算超出最大限制
# ZeroDivisionError 除(或取模)零(所有数据类型)
# AssertionError 断言语句失败
# AttributeError 对象没有这个属性
# EOFError 没有内建输入,到达EOF 标记
# EnvironmentError 操作系统错误的基类
# TypeError 对类型无效的操作
# ValueError 传入无效的参数
# UnicodeErrorUnicode 相关的错误
# UnicodeDecodeErrorUnicode 解码时的错误
# UnicodeEncodeErrorUnicode 编码时错误
# UnicodeTranslateErrorUnicode 转换时错误Warning警告的基类
# DeprecationWarning 关于被弃用的特征的警告
# FutureWarning 关于构造将来语义会有改变的警告
# OverflowWarning 旧的关于自动提升为长整型(long)的警告
# PendingDeprecationWarning 关于特性将会被废弃的警告
# RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
# SyntaxWarning 可疑的语法的警告
# UserWarning 用户代码生成的警告