2.1 - 错误、异常和警告
2.1.1 分类
语法错误:又称为 解析错误,写出了不符合python语法格式的代码会报:SyntaxError: invalid syntax。
警告:警告消息通常用于提示用户一些错误或者过时的用法,当这些情况发生时我们不希望抛出异常或者直接退出程序。警告消息通常写入 sys.stderr,对警告的处理方式可以灵活的更改。
异常:包含 TypeError、ZeroDivisionError、MemoryError等内置异常 和 自定义异常等。
2.1.2 异常的语法
# try - except - else try: i = 1 / 0 except TypeError: raise RuntimeError('捕获到一个类型异常') except: raise RuntimeError('捕获到一个异常') else: print('这段代码没有异常被捕获')
else分支的触发条件:如果try中没发生异常即:没有任何except发生过,则执行此else分支。
except:如果except中没有指定异常类型,则会捕获所有类型的异常; 如果except指定了异常类型,则只能捕获指定类型的异常;如果要捕获多个类型的异常,则可以使用 元组 ;如果一个异常没有 与任何的except匹配,则会报错
raise:主动抛出异常
class A(object): def test(self, x): try: res = 1 / x return -1 except: print('发生了一个异常') finally: print('fianlly 分支执行了') return -2 a = A() a.test(1) print('---------------') print(a.test(0))
finally子句:在【调用return结束之前】必须先执行finally分支;如果 finally子句中包含一个return语句,则最终返回值将来自finally子句中return的返回值,而非try子句中的return返回值。
2.1.3 断言
assert断言:类似于条件判断语句,不符合条件返回断言异常AssertionError。
【assert 条件,自定义断言日志】
class A(object): def test(self, x): try: res = 1 / x return -1 except: print('发生了一个异常') finally: print('fianlly 分支执行了') return -2 def test_assert(self, num): assert num > 0, f'{num} should be a positive number' # 断言 # print('num是一个正数') a = A() # 测试断言 a.test_assert(0)
2.1.4 自定义异常的两种方式
# 自定义异常方式一:重写 __init__ 和 __str__ 魔术方法 class MyError: def __init__(self, message=''): self.message = message def __str__(self): return str(self.message) # 自定义异常方式二:直接继承 Exception 类 class MyError2(Exception): pass print(MyError("发生了一个异常")) print(MyError2("发生了一个异常"))