stackit
stackit

Reputation: 3106

Does raising a manual exception in a python program terminate it?

Does invoking a raise statement in python cause the program to exit with traceback or continue the program from next statement? I want to raise an exception but continue with the remainder program. Well I need this because I am running the program in a thirdparty system and I want the exception to be thrown yet continue with the program. The concerned code is a threaded function which has to return . Cant I spawn a new thread just for throwing exception and letting the program continue?

Upvotes: 1

Views: 2437

Answers (2)

chepner
chepner

Reputation: 531798

Only an uncaught exception will terminate a program. If you raise an exception that your 3rd-party software is not prepared to catch and handle, the program will terminate. Raising an exception is like a soft abort: you don't know how to handle the error, but you give anyone using your code the opportunity to do so rather than just calling sys.exit().

If you are not prepared for the program to exit, don't raise an exception. Just log the error instead.

Upvotes: 1

Kos
Kos

Reputation: 72279

I want to raise an exception but continue with the remainder program.

There's not much sense in that: the program control either continues through the code, or ripples up the call stack to the nearest try block.

Instead you can try some of:

  • the traceback module (for reading or examining the traceback info you see together with exceptions; you can easily get it as text)
  • the logging module (for saving diagnostics during program runtime)

Example:

def somewhere():
    print 'Oh no! Where am I?'
    import traceback
    print ''.join(traceback.format_stack())  # or traceback.print_stack(sys.stdout)
    print 'Oh, here I am.'

def someplace():
    somewhere()

someplace()

Output:

Oh no! Where am I?
  File "/home/kos/exc.py", line 10, in <module>
    someplace()
  File "/home/kos/exc.py", line 8, in someplace
    somewhere()
  File "/home/kos/exc.py", line 4, in somewhere
    print ''.join(traceback.format_stack())

Oh, here I am.

Upvotes: 2

Related Questions