Question

I'm using custom exceptions to differ my exceptions from Python's default exceptions.

Is there a way to define a custom exit code when I raise the exception?

class MyException(Exception):
    pass

def do_something_bad():
    raise MyException('This is a custom exception')

if __name__ == '__main__':
    try:
        do_something_bad()
    except:
        print('Oops')  # Do some exception handling
        raise

In this code, the main function runs a few functions in a try code. After I catch an exception I want to re-raise it to preserve the traceback stack.

The problem is that 'raise' always exits 1. I want to exit the script with a custom exit code (for my custom exception), and exit 1 in any other case.

I've looked at this solution but it's not what I'm looking for: Setting exit code in Python when an exception is raised

This solution forces me to check in every script I use whether the exception is a default or a custom one.

I want my custom exception to be able to tell the raise function what exit code to use.

Was it helpful?

Solution

You can override sys.excepthook to do what you want yourself:

import sys

class ExitCodeException(Exception):
  "base class for all exceptions which shall set the exit code"
  def getExitCode(self):
    "meant to be overridden in subclass"
    return 3

def handleUncaughtException(exctype, value, trace):
  oldHook(exctype, value, trace)
  if isinstance(value, ExitCodeException):
    sys.exit(value.getExitCode())

sys.excepthook, oldHook = handleUncaughtException, sys.excepthook

This way you can put this code in a special module which all your code just needs to import.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top