示例#1
0
def test_catch_nested_group():
    value_runtime_errors = []
    zero_division_errors = []
    with catch(
        {
            (ValueError, RuntimeError): value_runtime_errors.append,
            ZeroDivisionError: zero_division_errors.append,
        }
    ):
        nested_group = ExceptionGroup(
            "nested", [RuntimeError("bar"), ZeroDivisionError()]
        )
        raise ExceptionGroup("booboo", [ValueError("foo"), nested_group])

    assert len(value_runtime_errors) == 1
    exceptions = value_runtime_errors[0].exceptions
    assert isinstance(exceptions[0], ValueError)
    assert isinstance(exceptions[1], ExceptionGroup)
    assert isinstance(exceptions[1].exceptions[0], RuntimeError)

    assert len(zero_division_errors) == 1
    assert isinstance(zero_division_errors[0], ExceptionGroup)
    assert isinstance(zero_division_errors[0].exceptions[0], ExceptionGroup)
    assert isinstance(
        zero_division_errors[0].exceptions[0].exceptions[0], ZeroDivisionError
    )
示例#2
0
def test_catch_ungrouped():
    value_type_errors = []
    zero_division_errors = []
    for exc in [ValueError("foo"), TypeError("bar"), ZeroDivisionError()]:
        with catch(
            {
                (ValueError, TypeError): value_type_errors.append,
                ZeroDivisionError: zero_division_errors.append,
            }
        ):
            raise exc

    assert len(value_type_errors) == 2

    assert isinstance(value_type_errors[0], ExceptionGroup)
    assert len(value_type_errors[0].exceptions) == 1
    assert isinstance(value_type_errors[0].exceptions[0], ValueError)

    assert isinstance(value_type_errors[1], ExceptionGroup)
    assert len(value_type_errors[1].exceptions) == 1
    assert isinstance(value_type_errors[1].exceptions[0], TypeError)

    assert len(zero_division_errors) == 1
    assert isinstance(zero_division_errors[0], ExceptionGroup)
    assert isinstance(zero_division_errors[0].exceptions[0], ZeroDivisionError)
    assert len(zero_division_errors[0].exceptions) == 1
示例#3
0
def test_catch_single_no_match():
    try:
        with catch({(ValueError, RuntimeError): (lambda e: None)}):
            raise ZeroDivisionError
    except ZeroDivisionError:
        pass
    else:
        pytest.fail("Did not raise an ZeroDivisionError")
示例#4
0
def test_catch_subclass():
    lookup_errors = []
    with catch({LookupError: lookup_errors.append}):
        raise KeyError("foo")

    assert len(lookup_errors) == 1
    assert isinstance(lookup_errors[0], ExceptionGroup)
    exceptions = lookup_errors[0].exceptions
    assert isinstance(exceptions[0], KeyError)
示例#5
0
def test_catch_no_match():
    try:
        with catch({(ValueError, RuntimeError): (lambda e: None)}):
            group = ExceptionGroup("booboo", [ZeroDivisionError()])
            raise group
    except ExceptionGroup as exc:
        assert exc is not group
    else:
        pytest.fail("Did not raise an ExceptionGroup")
示例#6
0
def test_catch_handler_raises():
    def handler(exc):
        raise RuntimeError("new")

    try:
        with catch({(ValueError, ValueError): handler}):
            raise ExceptionGroup("booboo", [ValueError("bar")])
    except ExceptionGroup as exc:
        assert exc.message == ""
        assert len(exc.exceptions) == 1
        assert isinstance(exc.exceptions[0], RuntimeError)
    else:
        pytest.fail("Did not raise an ExceptionGroup")
示例#7
0
def test_catch_ungrouped():
    exceptions1 = []
    exceptions2 = []
    for exc in [ValueError("foo"), TypeError("bar"), ZeroDivisionError()]:
        with catch({
            (ValueError, TypeError): exceptions1.append,
                ZeroDivisionError: exceptions2.append,
        }):
            raise exc

    assert len(exceptions1) == 2
    assert isinstance(exceptions1[0], ValueError)
    assert isinstance(exceptions1[1], TypeError)

    assert len(exceptions2) == 1
    assert isinstance(exceptions2[0], ZeroDivisionError)
示例#8
0
def test_catch_nested_group():
    exceptions1 = []
    exceptions2 = []
    with catch({
        (ValueError, RuntimeError): exceptions1.append,
            ZeroDivisionError: exceptions2.append,
    }):
        nested_group = ExceptionGroup(
            "nested",
            [RuntimeError("bar"), ZeroDivisionError()])
        raise ExceptionGroup("booboo", [ValueError("foo"), nested_group])

    assert len(exceptions1) == 2
    assert isinstance(exceptions1[0], ValueError)
    assert isinstance(exceptions1[1], RuntimeError)

    assert len(exceptions2) == 1
    assert isinstance(exceptions2[0], ZeroDivisionError)
示例#9
0
def test_bad_arg():
    with pytest.raises(TypeError, match="the argument must be a mapping"):
        with catch(1):
            pass
示例#10
0
def test_catch_exceptiongroup(exc_type):
    with pytest.raises(TypeError, match="catching ExceptionGroup with catch"):
        with catch({exc_type: (lambda e: True)}):
            pass
示例#11
0
def test_catch_full_match():
    with catch({(ValueError, RuntimeError): (lambda e: None)}):
        raise ExceptionGroup("booboo", [ValueError()])
示例#12
0
def test_bad_handler():
    with pytest.raises(TypeError, match="handlers must be callable"):
        with catch({RuntimeError: None}):
            pass