Skip to content

Commit 8a50b5f

Browse files
syntronadeas31
andauthored
[OMCSession] improve error log of sendExpression() (#375)
* [OMCSession] improve error log of sendExpression() * [OMCSessionZMQ] fix mypy error --------- Co-authored-by: Adeel Asghar <adeel.asghar@liu.se>
1 parent 019e544 commit 8a50b5f

File tree

1 file changed

+43
-18
lines changed

1 file changed

+43
-18
lines changed

OMPython/OMCSession.py

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,8 @@ def sendExpression(self, command: str, parsed: bool = True) -> Any:
729729
self.omc_zmq.send_string('getMessagesStringInternal()', flags=zmq.NOBLOCK)
730730
error_raw = self.omc_zmq.recv_string()
731731
# run error handling only if there is something to check
732+
msg_long_list = []
733+
has_error = False
732734
if error_raw != "{}\n":
733735
if not self._re_log_entries:
734736
self._re_log_entries = re.compile(pattern=r'record OpenModelica\.Scripting\.ErrorMessage'
@@ -737,41 +739,64 @@ def sendExpression(self, command: str, parsed: bool = True) -> Any:
737739
flags=re.MULTILINE | re.DOTALL)
738740
if not self._re_log_raw:
739741
self._re_log_raw = re.compile(
740-
pattern=r"\s+message = \"(.*?)\",\n" # message
741-
r"\s+kind = .OpenModelica.Scripting.ErrorKind.(.*?),\n" # kind
742-
r"\s+level = .OpenModelica.Scripting.ErrorLevel.(.*?),\n" # level
743-
r"\s+id = (.*?)" # id
744-
"(,\n|\n)", # end marker
742+
pattern=r"\s*info = record OpenModelica\.Scripting\.SourceInfo\n"
743+
r"\s*filename = \"(.*?)\",\n"
744+
r"\s*readonly = (.*?),\n"
745+
r"\s*lineStart = (\d+),\n"
746+
r"\s*columnStart = (\d+),\n"
747+
r"\s*lineEnd = (\d+),\n"
748+
r"\s*columnEnd = (\d+)\n"
749+
r"\s*end OpenModelica\.Scripting\.SourceInfo;,\n"
750+
r"\s*message = \"(.*?)\",\n" # message
751+
r"\s*kind = \.OpenModelica\.Scripting\.ErrorKind\.(.*?),\n" # kind
752+
r"\s*level = \.OpenModelica\.Scripting\.ErrorLevel\.(.*?),\n" # level
753+
r"\s*id = (\d+)", # id
745754
flags=re.MULTILINE | re.DOTALL)
746755

747756
# extract all ErrorMessage records
748757
log_entries = self._re_log_entries.findall(string=error_raw)
749758
for log_entry in reversed(log_entries):
750759
log_raw = self._re_log_raw.findall(string=log_entry)
751-
if len(log_raw) != 1 or len(log_raw[0]) != 5:
760+
if len(log_raw) != 1 or len(log_raw[0]) != 10:
752761
logger.warning("Invalid ErrorMessage record returned by 'getMessagesStringInternal()':"
753762
f" {repr(log_entry)}!")
754763
continue
755764

756-
log_message = log_raw[0][0].encode().decode('unicode_escape')
757-
log_kind = log_raw[0][1]
758-
log_level = log_raw[0][2]
759-
log_id = log_raw[0][3]
765+
log_filename = log_raw[0][0]
766+
log_readonly = log_raw[0][1]
767+
log_lstart = log_raw[0][2]
768+
log_cstart = log_raw[0][3]
769+
log_lend = log_raw[0][4]
770+
log_cend = log_raw[0][5]
771+
log_message = log_raw[0][6].encode().decode('unicode_escape')
772+
log_kind = log_raw[0][7]
773+
log_level = log_raw[0][8]
774+
log_id = log_raw[0][9]
760775

761-
msg = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
762-
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
776+
msg_short = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
777+
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
763778

764779
# response according to the used log level
765780
# see: https://build.openmodelica.org/Documentation/OpenModelica.Scripting.ErrorLevel.html
766781
if log_level == 'error':
767-
raise OMCSessionException(msg)
768-
769-
if log_level == 'warning':
770-
logger.warning(msg)
782+
logger.error(msg_short)
783+
has_error = True
784+
elif log_level == 'warning':
785+
logger.warning(msg_short)
771786
elif log_level == 'notification':
772-
logger.info(msg)
787+
logger.info(msg_short)
773788
else: # internal
774-
logger.debug(msg)
789+
logger.debug(msg_short)
790+
791+
# track all messages such that this list can be reported if an error occurred
792+
msg_long = (f"[{log_kind}:{log_level}:{log_id}] "
793+
f"[{log_filename}:{log_readonly}:{log_lstart}:{log_cstart}:{log_lend}:{log_cend}] "
794+
f"{log_message}")
795+
msg_long_list.append(msg_long)
796+
if has_error:
797+
msg_long_str = '\n'.join(f"{idx:02d}: {msg}" for idx, msg in enumerate(msg_long_list))
798+
raise OMCSessionException(f"OMC error occurred for 'sendExpression({command}, {parsed}):\n"
799+
f"{msg_long_str}")
775800

776801
if parsed is False:
777802
return result

0 commit comments

Comments
 (0)