Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new rule - not calling super() in custom exception's __init__() #8579

Open
m-aciek opened this issue Nov 9, 2023 · 1 comment
Open

new rule - not calling super() in custom exception's __init__() #8579

m-aciek opened this issue Nov 9, 2023 · 1 comment
Labels
rule Implementing or modifying a lint rule

Comments

@m-aciek
Copy link

m-aciek commented Nov 9, 2023

class CustomException(Exception):
    def __init__(self, custom: int, arguments: str) -> None:
        self.msg = f"Something specific happened with custom: {custom} and {arguments}"

Above exception class has an issue, in my personal experience it's quite common. The implementer assumes, that they will use the self.msg parameter during exception handling. The issue araises when the exception gets anywhere else as the its string representation is as follows:

>>> raise CustomException(42, 'test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.CustomException: (42, 'test')

and when the exception is instantiated with keyword arguments, we lose the information about the arguments' values.

>>> raise CustomException(custom=1, arguments='two')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.CustomException

How to fix it? By calling super().__init__() in the constructor. That way the string representation of the custom exception will contain the error message.

class CustomException(Exception):
    def __init__(self, custom: int, arguments: str) -> None:
        self.msg = "Something specific happened with custom: {custom} and {arguments}"
        super().__init__(self.msg)
>>> raise CustomException(1, 'two')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.CustomException: Something specific happened with custom: 1 and two
>>> raise CustomException(custom=1, parameters='two')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.CustomException: Something specific happened with custom: 1 and two

Specification proposal

If a class:

  • inherits from from Exception,
  • doesn't implement own __str__() method,
  • its __init__() method doesn't enforce any positional-only argument,
  • and doesn't call super().__init__() in its __init__() method

Then:

  • new rule should raise an error, calling to fix it.
@charliermarsh charliermarsh added rule Implementing or modifying a lint rule needs-decision Awaiting a decision from a maintainer labels Nov 10, 2023
@m-aciek
Copy link
Author

m-aciek commented Nov 16, 2023

For the reference, this has been accepted in flake8-bugbear.

@zanieb zanieb removed the needs-decision Awaiting a decision from a maintainer label Nov 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
rule Implementing or modifying a lint rule
Projects
None yet
Development

No branches or pull requests

3 participants