python3异常处理

1、语法错误和异常
语法错误是在代码执行前可以检测的,由于不符合代码语法规范引起的
异常指程序运行过程中导致的超出预期处理能力的情况

常见的异常:

0作为除数
未定义的对象被直接使用,比如参与运算或者调用其属性和方法
str类型直接和非str类型相加
输入输出与系统异常等
异常有两种处理方式:直接捕获进行处理,将其抛出由上级(调用异常代码)进行处理

2、捕获
(1)完整结构

try:
	执行代码
except:
    发生异常时执行的代码
else:
    没有异常时执行的代码
finally:
    无论是否发生异常时执行的代码

else和finally结构是可以省略的
finally结构实际可以考虑直接放在外部,这里主要是为了逻辑阐述的强迫性,保持功能的完整
一般关闭资源之类的操作会习惯放在finally在

(2)except

try:
    pass
except OSError as err
	print("OS error: {0}".format(err))
except ValueError:
    pass
except (RuntimeError, TypeError, NameError):
    pass
except:
    pass

try后可以跟多个except结构,从上到下匹配,匹配到后即执行,不再匹配其它except结构,而是考虑except之和else或者finally结构
一般将描述越详细的异常类型放在前面,将描述越宽广的类型放在后面
如果except后没有跟异常类型,表示匹配所有异常类型,一般放在except的末尾
except … as …结构为异常取一个别名,一般是考虑到异常类型会比较详细显得冗长,起一个简短的别名,方便在except内部使用
如果多个异常的处理方法一致,可以在一个except后添加一个元组,在元组中声明并列的多个异常类型

3、抛出
使用关键字raise,其后跟一个Exception的对象或者其类型的子类型的对象,完成抛出

if x > 5:
	raise Exception('这里发生了异常,x>5')

一个方法中存在抛出异常的行为,则调用该方法的代码需要进行捕获,捕获的类型为抛出时创建的异常类型

4、自定义异常

class MyError(Exception):
    def __init__(self, value):
        self.value = value
	def __str__(self):
		return repr(self.value)

一般自定义异常,就是创建一个能够显示异常类型的类名的类,不需要做其它操作
其作用就是记录异常类型和异常信息,在传递过程中方便被调用查看

5、__init__方法中的异常

(1)一般来说,如果发生异常不进行处理,程序会直接结束

(2)异常处理,即except,对于其它行代码来说,相当于try结构中发生异常的代码行及其后不存在,而异常代码行之前的代码和except结构中的代码有效。

try:
    name = 'aa'
    age = 1/0
    sex = 'boy'
except Except as e:
    age = 18
  • age=1/0,发生异常。此时age和sex相当于未定义
  • except结构中,当发生异常时,执行

(3)__init__方法中也可能发生异常

当初始化方法内发生异常,立即try...except捕获

  • 如果异常代码是进行赋值,则赋值变量相当于未声明

当初始化方法内发生异常,不进行处理,而是上层进行捕获处理

  • 相当于对象未声明

 

  •  
  •  
  • __init__方法中也可能发生异常
  • 初始化方法中发生异常,只要对异常部分进行捕获处理,就可以正常执行其余部分,此时该对象存在,但是接收异常的对象变量不存在。
posted @ 2023-05-28 09:41  挖洞404  阅读(96)  评论(0编辑  收藏  举报