diff --git a/mypy/checker.py b/mypy/checker.py index af223506ecd3..c475748ec2fe 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -3424,6 +3424,10 @@ def type_check_raise(self, e: Expression, s: RaiseStmt, expected_type.items.append(TupleType([any_type, any_type, any_type], tuple_type)) self.check_subtype(typ, expected_type, s, message_registry.INVALID_EXCEPTION) + if isinstance(typ, FunctionLike): + # https://github.com/python/mypy/issues/11089 + self.expr_checker.check_call(typ, [], [], e) + def visit_try_stmt(self, s: TryStmt) -> None: """Type check a try statement.""" # Our enclosing frame will get the result if the try/except falls through. diff --git a/test-data/unit/check-statements.test b/test-data/unit/check-statements.test index 33e10650476d..62d82f94a6c1 100644 --- a/test-data/unit/check-statements.test +++ b/test-data/unit/check-statements.test @@ -406,8 +406,7 @@ class MyError(BaseException): pass [out] main:5: error: Exception must be derived from BaseException -[case testRaiseClassobject] -import typing +[case testRaiseClassObject] class A: pass class MyError(BaseException): pass def f(): pass @@ -418,6 +417,33 @@ raise object # E: Exception must be derived from BaseException raise f # E: Exception must be derived from BaseException [builtins fixtures/exception.pyi] +[case testRaiseClassObjectCustomInit] +class MyBaseError(BaseException): + def __init__(self, required) -> None: + ... +class MyError(Exception): + def __init__(self, required1, required2) -> None: + ... +class MyKwError(Exception): + def __init__(self, *, kwonly) -> None: + ... +class MyErrorWithDefault(Exception): + def __init__(self, optional=1) -> None: + ... +raise BaseException +raise Exception +raise BaseException(1) +raise Exception(2) +raise MyBaseError(4) +raise MyError(5, 6) +raise MyKwError(kwonly=7) +raise MyErrorWithDefault(8) +raise MyErrorWithDefault +raise MyBaseError # E: Too few arguments for "MyBaseError" +raise MyError # E: Too few arguments for "MyError" +raise MyKwError # E: Missing named argument "kwonly" for "MyKwError" +[builtins fixtures/exception.pyi] + [case testRaiseExceptionType] import typing x = None # type: typing.Type[BaseException]