Is there a difference between "raise exception()" and "raise exception" without parenthesis?

PythonException

Python Problem Overview


Defining a parameterless exception:

class MyException(Exception):
    pass

When raised, is there any difference between:

raise MyException

and

raise MyException()

I couldn't find any; is it simply an overloaded syntax?

Python Solutions


Solution 1 - Python

The short answer is that both raise MyException and raise MyException() do the same thing. This first form auto instantiates your exception.

The relevant section from the docs says:

>raise evaluates the first expression as the exception object. It must be either a subclass or an instance of BaseException. If it is a class, the exception instance will be obtained when needed by instantiating the class with no arguments.

That said, even though the semantics are the same, the first form is microscopically faster, and the second form is more flexible (because you can pass it arguments if needed).

The usual style that most people use in Python (i.e. in the standard library, in popular applications, and in many books) is to use raise MyException when there are no arguments. People only instantiate the exception directly when there some arguments need to be passed. For example: raise KeyError(badkey).

Solution 2 - Python

Go look at the docs for the raise statement. It's creating an instance of MyException.

Solution 3 - Python

Yep, there is a difference between ValueError and ValueError()

ValueError is a class whereas ValueError() creates an instance of a class. This is the reason the type(ValueError) is type and type(ValueError()) is ValueError

The sole purpose of raise is to raise the exception,

>when we use ValueError, class will be called which in turn runs the constructor ValueError() > > when we use ValueError(), the method ValueError() is directly called.

Note: raise ValueError # shorthand for 'raise ValueError()'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionOhad DanView Question on Stackoverflow
Solution 1 - PythonRaymond HettingerView Answer on Stackoverflow
Solution 2 - PythonJason FriedView Answer on Stackoverflow
Solution 3 - PythonRanjith UdayakumarView Answer on Stackoverflow