"""
Module for ErrorReport objects.
An :class:`~mirar.errors.error_report.ErrorReport` object summarises a single error
raised by the code.
"""
import logging
import traceback
from datetime import datetime
from pathlib import Path
from mirar.errors.exceptions import BaseProcessorError, NoncriticalProcessingError
logger = logging.getLogger(__name__)
[docs]
class ErrorReport:
"""
Class representing a single error raised during processing
"""
def __init__(
self, error: Exception, processor_name: str, contents: list[str] | list[Path]
):
self.error = error
self.processor_name = processor_name
self.contents = contents
self.t_error = datetime.now()
self.known_error_bool = isinstance(self.error, BaseProcessorError)
self.non_critical_bool = isinstance(self.error, NoncriticalProcessingError)
[docs]
def message_known_error(self) -> str:
"""
Returns a human-readable string describing whether the error was an internal one
intentionally raised by the code, or an unexpected external error
:return: String describing whether error was known
"""
return (
f"This error {['was not', 'was'][self.known_error_bool]} "
f"a known error raised by mirar."
)
[docs]
def generate_log_message(self) -> str:
"""
Returns a human-readable string describing high-livel details about the error.
:return: String summary
"""
return (
f"Error for processor {self.processor_name} at time {self.t_error} UT: "
f"{self.get_error_name()} affected batch of length {len(self.contents)}. "
f"{self.message_known_error()}. \n"
)
[docs]
def generate_full_traceback(self) -> str:
"""
Returns a verbose string summarising the error
:return: String
"""
msg = (
f"Error for processor {self.processor_name} at {self.t_error} "
f"(local time): \n "
f"{''.join(traceback.format_tb(self.error.__traceback__))}"
f"{self.get_error_name()}: {self.error} \n "
f"This error affected the following files: {self.contents} \n"
f"{self.message_known_error()} \n \n"
)
return msg
[docs]
def get_error_name(self) -> str:
"""
Returns the name of the error
:return: Name
"""
return type(self.error).__name__
[docs]
def get_error_message(self) -> str:
"""
Returns the full error message raised by python
:return: String for single line
"""
return traceback.format_tb(self.error.__traceback__)[-1]
[docs]
def get_error_line(self) -> str:
"""
Returns only the critical error line raised by python
:return: string
"""
return self.get_error_message().split("\n")[0]