5 异常处理

异常是程序发生错误的信号。程序一旦出现错误,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序的运行也随之终止。

'''
Traceback:异常的追踪信息
'''

# 2.错误分为两种:
# 语法错误:在程序执行前就要立刻改正过来

# 逻辑错误

# TypeError:数字类型无法与字符串类型相加
1+’2’

# ValueError:当字符串包含有非数字的值时,无法转成int类型
int("aaa")

# NameError:引用了一个不存在的名字x
x

# IndexError:索引超出列表的限制
l=['egon','aa']
l[3]

# KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']

# AttributeError:引用的属性不存在
class Foo:
    pass
Foo.x

# ZeroDivisionError:除数不能为0
1/0

1 异常处理

为了保证程序的容错性与可靠性,即在遇到错误时有相应的处理机制不会任由程序崩溃掉,我们需要对异常进行处理,处理的基本形式为

try:
    被检测的代码块
except 异常类型:
    检测到异常,就执行这个位置的逻辑
  • 强调一:错误发生的条件如果是可以预知的,此时应该用if判断去预防异常
age = 10
cmd = input('>>>:').strip()
if cmd.isdigit():
    cmd = int(cmd)
    if cmd > age:
        print('太大了')
  • 强调二:错误发生的条件如果是不可预知的,此时应该用异常处理机制,try...except...
# 前提我们根本就不知道文本有多少行,何时出错。
try:
    f = open('a.txt', 'r', encoding='utf-8')
    print(next(f), end='')
    print(next(f), end='')
    print(next(f), end='')
    f.close()
except StopIteration:
    print('出错了...')

2 详细用法

  1. 异常的多分支(被监控的代码块异常有多种可能性,为每一个异常处理单独的逻辑)
try:
    print(">>>>1")
    name
    print(">>>>2")
    l = [1, 2, 3]
    l[10]
except NameError as e:
    print("错误信息赋值给了e", e)
except IndexError as e:
    print("错误信息赋值给了e", e)
print('执行完毕..')
  1. 万能异常(Exception,被检测到代码块抛出异常有多种可能性,并且针对所有异常类型都只用一种处理逻辑)

    try:
        print(">>>>1")
        name
        print(">>>>2")
        l = [1, 2, 3]
        l[10]
    except Exception as e:
        print("异常:", e)
    print('执行完毕..')
    
  2. 其他结构

    finally: # finally通常使用在回收资源这块

    try:
        print(">>>>1")
        name
        print(">>>>2")
        l = [1, 2, 3]
        l[10]
    except NameError as e:
        print("错误信息赋值给了e", e)
    except IndexError as e:
        print("错误信息赋值给了e", e)
    except Exception as e:
        print("异常:", e)
    else:
        print("在被检测的代码块没有发生异常时执行..")
    finally:  # finally通常使用在回收资源这块
        print("不管被检测的代码块有没有发生异常都会执行..")
    print('执行完毕..')
    

3 raise

主动触发异常:raise 异常类型(值)

class People:
    def __init__(self, name, age):
        if not isinstance(name, str):
            raise TypeError('名字需传入str类型')
        if not isinstance(age, int):
            raise TypeError('年龄需传入int类型')
        self.name = name
        self.age = age

p = People('egon', 12)

4 断言

assert断言:断定一件事成立,如果不成立抛出异常。

info = {}
info['name'] = 'alex'
info['age'] = 19

assert ('name' in info) and ('age' in info)

if info['name'] == 'alex' and info['age'] == 19:
    print('welcome')

5 自定义异常

继承BaseException

class MyException(BaseException):
    def __init__(self, msg):
        super(MyException, self).__init__()
        self.msg = msg

    def __str__(self):
        return '<%s>' % self.msg

raise MyException('我自己的异常类型')
posted @ 2022-09-22 16:35  角角边  Views(51)  Comments(0)    收藏  举报