import re from javonet.utils.exception.JavonetException import JavonetException from javonet.utils.Command import Command from javonet.utils.ExceptionType import ExceptionType class ExceptionThrower: @staticmethod def throw_exception(command_exception: Command): stack_classes, stack_methods, stack_lines, stack_files = "", "", "", "" exception_message = "Python Exception with empty message" exception_name = "Python exception" javonet_stack_command = "" traceback_str = "" exception_payload_len = len(command_exception.payload) if exception_payload_len >=8: stack_classes, stack_methods, stack_lines, stack_files = ExceptionThrower.get_local_stack_trace( command_exception.get_payload()[4], command_exception.get_payload()[5], command_exception.get_payload()[6], command_exception.get_payload()[7]) if exception_payload_len >= 4: exception_message = command_exception.get_payload()[3] if exception_payload_len >= 3: exception_name = command_exception.get_payload()[2] if exception_payload_len >= 2: javonet_stack_command = command_exception.get_payload()[1] if exception_payload_len >= 1: original_exception = ExceptionType.to_exception(command_exception.get_payload()[0]) for i in range(len(stack_classes)): if i < len(stack_files) and stack_files[i]: traceback_str += "File \"{}\"".format(stack_files[i]) if i < len(stack_lines) and stack_lines[i]: traceback_str += ", line {}".format(stack_lines[i]) if i < len(stack_methods) and stack_methods[i]: traceback_str += ", in {}".format(stack_methods[i]) traceback_str += "\n" if i < len(stack_classes) and stack_classes[i]: traceback_str += " {}\n".format(stack_classes[i]) return ExceptionThrower.raise_exception(original_exception, exception_message, traceback_str) @staticmethod def raise_exception(original_exception, exception_message, traceback_str): return JavonetException(str(original_exception), exception_message, traceback_str) @staticmethod def get_local_stack_trace(stack_trace_classes, stack_trace_methods, stack_trace_lines, stack_trace_files): try: stack_classes = re.split("\\|", stack_trace_classes) except Exception: stack_classes = "" try: stack_methods = re.split("\\|", stack_trace_methods) except Exception: stack_methods = "" try: stack_lines = re.split("\\|", stack_trace_lines) except Exception: stack_lines = "" try: stack_files = re.split("\\|", stack_trace_files) except Exception: stack_files = "" return [stack_classes, stack_methods, stack_lines, stack_files]