Source code for pypago.disp
# -*- coding: utf-8 -*-
"""
Module that handles output of errors and log messages
"""
from __future__ import print_function
import sys
import linecache
[docs]class PypagoErrors(Exception):
"""
This class is made to handle errors/warnings in |pypago|
:param str message: Message to print in the error (value of the exception)
:param str type: A string to indicate what kind of errors is raised
(should be 'Warning' or 'Error').
"""
def __init__(self, message):
"""
Initialisation of the Exception class
:param str message: Message to print in the error (value of the
exception)
:param str type: A string to indicate what kind of errors is raised
(should be 'Warning' or 'Error').
"""
# initialisation as suggested by PyLint
super(PypagoErrors, self).__init__()
self.message = '\n@@@@@@@@@@@@@@@@@@ PypagoErrors @@@@@@@@@@@@@@@@@@\n'
self.message += message
self.message += '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n'
self.value = self._make_str()
def __str__(self):
""" Function that redefines the __str__ function """
return self.value
[docs] def _make_str(self):
"""
Function which handles the creation of an error/warning message
containing the name of the exception, of the :file:`.py` file,
the line number and the line content that raised the exception/warning.
Inspired from `Apogentus answer
<http://stackoverflow.com/questions/14519177/python-exception-handling-line-number>`
"""
# sys.exc_info() returns info on the exception that is handled
# tb is the traceback, in which we are interested
# if no exception are provided, then arg returns a tuple of None
arg = sys.exc_info()
if arg[2] is None:
filename = __name__ + '.py'
strout = '{}'.format(self.message)
else:
# f is the frame associated with the traceback
tb_frame = arg[2].tb_frame
# this is the line number where the exception has been raised
lineno = arg[2].tb_lineno
# this is the filename
filename = tb_frame.f_code.co_filename
# allows to recover the line responsible for the warning
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, tb_frame.f_globals)
strout = '{} (in {}, line {}: "{}")'.format(self.message,
filename, lineno,
line.strip())
return strout