八、pytest异常处理

# -*- coding: utf-8 -*-
# @Time    : 2023/6/8 20:37
# @Author  : yanfa
# @user   : yanfa 
# @File    : pytest_for_exception.py
# @remark: pytest 异常处理

"""常用异常处理方式
1/ try...except
try:
    可能产生异常的代码块
except[(Error1,Error2,...)][as e]]:
    处理异常的代码块1
except[(Error3,Error4,...)][as e]]:
    处理异常的代码块2
except [Exception]
    处理其他异常
    """
# try:
#     a=int(input("输出被除数:"))
#     b=int(input("输出除数:"))
#     c=a/b
#     print(f"相除结果为:{c}")
# except (ValueError,ArithmeticError):
#     print("程序发生数字格式异常或算数异常")
# except:
#     print("其他异常")
import pytest

"""
2/ pytest.raise()
可以捕获特定的异常
获取捕获的异常的细节,如异常类型,异常信息
发生异常,后面的代码将不会被执行"""

def test_raise():
    with pytest.raises(ValueError,match='must be 0 or None'):
        raise ValueError("must be 0 or None") #执行成功
        # raise ZeroDivisionError("除数为0") #执行失败,因为捕获和抛出的类型不一致

def test_raise1():
    # 同时抛出多个异常
    with pytest.raises((ValueError,ZeroDivisionError)):
        raise ZeroDivisionError("除数为0") #执行成功

def test_raise2():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("value must be 42")
    # 获取异常类型和信息
    assert exc_info.type is ValueError
    assert exc_info.value.args[0]=="value must be 42"