I have read the official definition of "raise", but I still don't quite understand what it does.
In simplest terms, what is "raise"?
Example usage would help.
It has two purposes.
jackcogdill has given the first one:
It's used for raising your own errors.
if something: raise Exception('My error!')
The second is to reraise the current exception in an exception handler, so that it can be handled further up the call stack.
try:
generate_exception()
except SomeException as e:
if not can_handle(e):
raise
handle_exception(e)
except SomeException as e:as e do? How is it different from except SomeException?raise without any arguments is a special use of python syntax. It means get the exception and re-raise it. If this usage it could have been called reraise.
raise
From The Python Language Reference:
If no expressions are present, raise re-raises the last exception that was active in the current scope.
If raise is used alone without any argument is strictly used for reraise-ing. If done in the situation that is not at a reraise of another exception, the following error is shown:
RuntimeError: No active exception to reraise
Besides raise Exception("message") and raise Python 3 introduced a new form, raise Exception("message") from e. It's called exception chaining, it allows you to preserve the original exception (the root cause) with its traceback.
It's very similar to inner exceptions from C#.
More info: https://www.python.org/dev/peps/pep-3134/
raise causes an exception to be raised. Some other languages use the verb 'throw' instead.
It's intended to signal an error situation; it flags that the situation is exceptional to the normal flow.
Raised exceptions can be caught again by code 'upstream' (a surrounding block, or a function earlier on the stack) to handle it, using a try, except combination.
trace on bottom call where error occurs or the most higher call? or it is recommend to do raise Exception("message") from e to carry the error tothe top level?except ...: handler, the traceback will include the whole stack, from the point where your Python program started up to the place where the exception was raised. So it doesn't matter where in the stack your handler is located, really. If you need to re-raise the exception after handling, use raise, nothing else.raise Exception("message") from e replaces the e exception with a new exception, but just a plain Exception instance carries no meaning. If e was a TypeError or ValueError or LibrarySpecificException you can't now catch those specific exceptions anymore, because you replaced it with Exception.
throwin some other languages.raiseexits the function automatically or does one need toreturnafterraise?