import pickle

import math


def handleSingleError():
    outfile = open(r"./file/1.dat", "wb")
    # 卸载,序列化
    pickle.dump(123, outfile)
    pickle.dump(45.6, outfile)
    pickle.dump(True, outfile)
    pickle.dump(["fuck", "shit", "welcome"], outfile)
    outfile.close()
    infile = open(r"./file/1.dat", "rb")
    # 加载,反序列化
    try:
        print(pickle.load(infile))
        print(pickle.load(infile))
        print(pickle.load(infile))
        print(pickle.load(infile))
        print(pickle.load(infile))
        print(pickle.load(infile))
        print("请领取一百万")
    except EOFError:
        print("读你妹啊")

    # 异常捕获后的代码仍可以正常向下执行
    print("给我一百块")
    infile.close()


def handleMoreError():
    try:
        # 有可能发生异常的代码片段
        print(5 / 0)
        print(int("fuck off"))
        mdict = {"name": "Python1701"}
        print(mdict["age"])

    # # 异常的父类应写在靠后的位置
    # except Exception:
    #     print("捕获了一个异常")

    # 捕获并处理ZeroDivisionError
    except ZeroDivisionError:
        print("分母不能为零菜逼")

    # 捕获并处理ValueError
    except ValueError:
        print("ValueError菜逼")

    # 捕获并处理KeyError
    except KeyError:
        print("KeyError菜逼")

    # 非必须子句:捕获了其它类型的异常
    except:
        print("发生了未知异常菜逼")

    # 非必须子句:没有发生异常时执行
    else:
        print("干掉不错小伙子")

    # 非必须子句:无论是否捕获异常都执行
    finally:
        print("劳资是无论如何都会执行的")

    # 异常捕获后的代码仍可以正常向下执行
    print("done")


def raiseError():
    try:
        radius = eval(input("请输入圆的半径:"))
        if radius < 0:
            # 当半径为负数时,抛出一个异常,以便捕获和【解决】
            raise RuntimeError("傻叉,圆的半径不能为负数")
        area = math.pi * radius ** 2
        print("圆的面积是%.2f" % (area))

    # 捕获一个异常,起一个别名叫做e
    except Exception as e:
        # 打印异常信息
        print("发生了一个异常:", e)

    # 异常捕获后的代码仍可以正常向下执行
    print("done!")


# 继承RuntimeError实现一个自定义的异常类,用于精确抛出非法半径异常
class InvalidRadiusError(RuntimeError):
    # 接收非法半径,赋值给当前实例(实例会被try所捕获)
    def __init__(self, radius):
        super().__init__()
        self.raius = radius

    def __str__(self):
        return "fuck,the radius %d is fucking invalid" % (self.raius)


'''
1、当用户输入非法半径时,
2、构造一个InvalidRadiusError的实例,将radius作为参数赋值给实例的self.raius:
    raise InvalidRadiusError(radius)
3、这个实例会给try所捕获,所以e就是self
    except InvalidRadiusError as e
4、从e中拿到self.raius,给用户以精确提示:
    print("傻叉,%d是非法半径" % e.raius)
'''


def raiseCustomError():
    try:
        radius = eval(input("请输入圆的半径:"))
        if radius < 0:
            # 当半径为负数时,抛出一个自定义异常,传递所需参数
            raise InvalidRadiusError(radius)
        area = math.pi * radius ** 2
        print("圆的面积是%.2f" % (area))

    # 捕获一个异常,起一个别名叫做e
    except InvalidRadiusError as e:
        # 打印异常信息
        print(e)
        print("傻叉,%d是非法半径" % e.raius)

    # 异常捕获后的代码仍可以正常向下执行
    print("done!")


if __name__ == '__main__':
    # handleSingleError()
    # handleMoreError()
    # raiseError()
    raiseCustomError()

    pass

results matching ""

    No results matching ""