Source code for simbad.exit
"""Exit utility for catching errors and printing unified error messages"""
__author__ = "Jens Thomas & Felix Simkovic"
__date__ = "08 May 2017"
__version__ = "1.1"
import logging
import os
import sys
import traceback
try:
import pyrvapi
except ImportError:
pyrvapi = None
def _debug_logfile(logger):
"""Get the debug logfile"""
if logger.handlers:
for d in logger.handlers:
if hasattr(d, "baseFilename") and d.level == logging.DEBUG:
return getattr(d, "baseFilename")
return None
[docs]def exit_error(exc_type, exc_value, exc_traceback):
"""Exit on error collecting as much information as we can.
Parameters
----------
exc_type : str
The exception type
exc_value : str
The exception value
exc_traceback
The exception traceback
Warnings
--------
This function terminates the program after printing appropriate
error messages.
"""
# Get the root logger
logger = logging.getLogger(__name__)
# Traceback info
traceback_value_msg = exc_value
traceback_full_msg = traceback.format_exception(exc_type, exc_value, exc_traceback)
# Find debug log file
debug_log = _debug_logfile(logger)
# Construct the message
main_msg = (
"%(sep)s%(hashish)s%(sep)s"
+ "%(short_hash)s%(msg)s%(short_hash)s%(sep)s"
+ "%(hashish)s%(sep)s%(sep)s"
+ "SIMBAD exited with message: %(tb_value)s"
+ "%(sep)s%(sep)s%(hashish)s%(sep)s%(sep)s"
)
if debug_log:
main_msg += "More information may be found in the debug log file: %(logfile)s%(sep)s"
main_msg += "%(sep)sIf you believe that this is an error with SIMBAD, please email: %(email)s%(sep)s"
main_msg += "providing as much information as you can about how you ran the program.%(sep)s"
if debug_log:
main_msg += "%(sep)sPlease static the debug logfile with your email: %(logfile)s%(sep)s"
nhashes = 70
main_msg_kwargs = {
"sep": os.linesep,
"hashish": "*" * nhashes,
"short_hash": "*" * 19,
"msg": "SIMBAD_ERROR".center(32, " "),
"tb_value": traceback_value_msg,
"logfile": debug_log,
"email": "ccp4@stfc.ac.uk",
}
# String it all together
logger.critical(main_msg, main_msg_kwargs)
logger.critical("SIMBAD EXITING AT...")
logger.critical("".join(traceback_full_msg))
# Make sure the error widget is updated
if pyrvapi:
pyrvapi.rvapi_flush()
sys.exit(1)