异常处理

# -*- coding: utf-8 -*-
"""
什么是异常处理
    异常是错误发生的信号,一旦程序出错就会产生一个异常,
    如果该异常没有被应用程序处理,那么该异常就会被抛出来,程序的执行也会随之终止
    
    异常包含三个部分:
        1.traceback 异常的追踪信息
        2.异常的类型
        3.异常的信息
    
    为什么处理异常:
        避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
    错误分为两大类:
        1.语法错误
        2.逻辑上的错误
    常见的异常类型:
        TypeError:类型错误
        IndexError:索引错误
        AttrbuiteError:属性错误
        等
        
    3 如何处理异常:
    try:
        代码1
        代码2
        .....
    except NameError:
        如果异常执行的代码块
"""

try:
    ls = [1, 2, 3, 4]
    print(ls[10])
except IndexError:
    print('索引错误')

print('else code')

# 索引错误
# else code


age = input(">>:").strip()
if age > 10: print(age)  # TypeError: '>' not supported between instances of 'str' and 'int'


import os

os.xxx  # AttributeError: module 'os' has no attribute 'xxx'


# 异常处理的多分支
try:
    print('1============')
    print('2=============')
    d = {'x': 1, 'y': 2}  # KeyError
    print(d['z'])
    print('3===========')
    ls = [1, 2, 3, 4]
    print(ls[10])
    print('4==========')
except IndexError as e:  # 其别名接收异常的值
    print('IndexError')
except KeyError as e:
    print('KeyError', e)  # KeyError 'z'
print('else code')
# 1============
# 2=============
# KeyError  #
# else code


"""
万能异常类型: 特点---可以匹配任意类型的异常
    一般用于不管发什么异常,都用统一的代码块
        比如 针对 keyerror 用一段处理逻辑
            针对 indexerror 用一段处理逻辑
            其他异常 统一用一段处理逻辑
"""

try:
    print('1============')
    print('2=============')
    d = {'x': 1, 'y': 2}  # KeyError
    print(d['z'])
    print('3===========')
    ls = [1, 2, 3, 4]
    print(ls[10])
    print('4==========')
except IndexError as e:  # 其别名接收异常的值
    print('IndexError')
except Exception as e:
    print('Exception', e)  # Exception 'z'
print('else code')

"""
try:

exception:

else:

"""

try:
    print('1============')
    print('2=============')
    d = {'x': 1, 'y': 2}  # KeyError
    # print(d['z'])
    print('3===========')
    ls = [1, 2, 3, 4]
    # print(ls[10])
    print('4==========')
except IndexError as e:  # 其别名接收异常的值
    print('IndexError')
except Exception as e:
    print('Exception', e)  # Exception 'z'
    print('else code')
else:
    print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行')

# 1============
# 2=============
# 3===========
# 4==========
# else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行

"""
finally:无论被检测的代码块是否异常,都会运行
"""

try:
    print('1============')
    print('2=============')
    d = {'x': 1, 'y': 2}  # KeyError
    print(d['z'])
    print('3===========')
    ls = [1, 2, 3, 4]
    print(ls[10])
    print('4==========')
except IndexError as e:  # 其别名接收异常的值
    print('IndexError')
except Exception as e:
    print('Exception', e)  # Exception 'z'
    print('else code')
else:
    print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行')

finally:
    print('无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收')

# 1============
# 2=============
# Exception 'z'
# else code
# 无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收


"""
自定义自己的异常类
"""


# 主动触发异常:
#     raise
# print('1')
# raise TypeError('类型错误')

class MyException(BaseException):
    def __init__(self, msg):
        super().__init__()
        self.msg = msg
    
    def __str__(self):
        return '<%s>' % self.msg


# raise MyException('我是自定义异常')
# __main__.MyException: <我是自定义异常>

# raise 抛异常
class People:
    def __init__(self, name, age):
        self.__age = age
        self.__name = name
    
    def tell_info(self):
        print(self.__name, self.__age)
    
    def set_info(self, name, age):
        if not isinstance(name, str):
            raise TypeError('请传入字符串类型名字')
        if not isinstance(age, int):
            raise TypeError('请传入数字类型')
        else:
            self.__name = name
            self.__age = age


# obj = People('qzk', 18)
# obj.set_info(199, 'qqq')  # raise TypeError('请传入字符串类型名字')

"""
断言
"""
# 基本原理
print('上半部分程序产生的数据')
l = [1, 2, 3, 4]

if len(l) != 5:
    raise Exception('列表长度必须为5')

print('下半部分处理程序')

#     raise Exception('列表长度必须为5')
# Exception: 列表长度必须为5


print('上半部分程序产生的数据')
l = [1, 2, 3, 4]
assert len(l) == 5
print('下半部分处理程序')
# 上半部分程序产生的数据
# Traceback (most recent call last):
#   File "E:/异常处理.py", line 222, in <module>
#     assert len(l) == 5
# AssertionError
原文地址:https://www.cnblogs.com/qianzhengkai/p/10787112.html