You can try logging
module as well
Original Answer:
Perhaps I don't want the "During handling of the above exception..." line (and the lines above it) to appear.
import logging
try:
import someProprietaryModule
except Exception as e:
if hasattr(e, 'message'):
logging.warning('python2')
logging.error(e.message)
else:
logging.warning('python3')
logging.error('It appears that <someProprietaryModule> is not installed...')
gives
WARNING:root:python3
ERROR:root:It appears that <someProprietaryModule> is not installed...
[Program finished]
Edit:
import logging
class MyExceptionType(Exception):
"""Base class for other exceptions"""
pass
try:
from someProprietaryModule import *
except Exception as e:
logging.warning('python3')
logging.exception("Failed to import <someProprietaryModule>. Is it installed?", exc_info=False)
raise MyExceptionType from e
logging.exception
will emit the stacktrace alongside the localized error message, which makes it quite useful.
Casting an exception to a string to print it removes 90% of the useful information.
Silently suppressing exceptions is almost always an error and is most commonly a footgun.
Edit 2:
import logging
class MyExceptionType(Exception):
"""Base class for other exceptions"""
pass
try:
import someProprietaryModule
except Exception as e:
error_message = "Failed to import <someProprietaryModule>. Is it installed?"
logging.warning('python3')
logging.error(error_message, exc_info=True) # Log the stacktrace along with the message
raise MyExceptionType(error_message) from e
The exc_info parameter in the logging.error call is set to True, allowing the logging module to include the exception information, including the traceback, in the log output.
The localized error message is stored in a variable error_message, which makes the code more readable and allows for easy changes if needed.