Proper way to declare custom exceptions in modern Python?

后端 未结 11 1872
栀梦
栀梦 2020-11-22 08:04

What\'s the proper way to declare custom exception classes in modern Python? My primary goal is to follow whatever standard other exception classes have, so that (for instan

11条回答
  •  不知归路
    2020-11-22 08:34

    To define your own exceptions correctly, there are a few best practices that you should follow:

    • Define a base class inheriting from Exception. This will allow to easily catch any exceptions related to the project:

      class MyProjectError(Exception):
          """A base class for MyProject exceptions."""
      

      Organizing the exception classes in a separate module (e.g. exceptions.py) is generally a good idea.

    • To create a specific exception, subclass the base exception class.

    • To add support for extra argument(s) to a custom exception, define a custom __init__() method with a variable number of arguments. Call the base class's __init__(), passing any positional arguments to it (remember that BaseException/Exception expect any number of positional arguments):

      class CustomError(MyProjectError):
          def __init__(self, *args, **kwargs):
              super().__init__(*args)
              self.foo = kwargs.get('foo')
      

      To raise such exception with an extra argument you can use:

       raise CustomError('Something bad happened', foo='foo')
      

    This design adheres to the Liskov substitution principle, since you can replace an instance of a base exception class with an instance of a derived exception class. Also, it allows you to create an instance of a derived class with the same parameters as the parent.

提交回复
热议问题