Skip to content

Commit a7aef1e

Browse files
committed
[OMCSession] improve error log of sendExpression()
1 parent d25aaa1 commit a7aef1e

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

OMPython/OMCSession.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,8 @@ def sendExpression(self, command: str, parsed: bool = True) -> Any:
722722
self.omc_zmq.send_string('getMessagesStringInternal()', flags=zmq.NOBLOCK)
723723
error_raw = self.omc_zmq.recv_string()
724724
# run error handling only if there is something to check
725+
msg_long_list = []
726+
has_error = False
725727
if error_raw != "{}\n":
726728
if not self._re_log_entries:
727729
self._re_log_entries = re.compile(pattern=r'record OpenModelica\.Scripting\.ErrorMessage'
@@ -730,41 +732,63 @@ def sendExpression(self, command: str, parsed: bool = True) -> Any:
730732
flags=re.MULTILINE | re.DOTALL)
731733
if not self._re_log_raw:
732734
self._re_log_raw = re.compile(
733-
pattern=r"\s+message = \"(.*?)\",\n" # message
734-
r"\s+kind = .OpenModelica.Scripting.ErrorKind.(.*?),\n" # kind
735-
r"\s+level = .OpenModelica.Scripting.ErrorLevel.(.*?),\n" # level
736-
r"\s+id = (.*?)" # id
737-
"(,\n|\n)", # end marker
735+
pattern=r"\s*info = record OpenModelica\.Scripting\.SourceInfo\n"
736+
r"\s*filename = \"(.*?)\",\n"
737+
r"\s*readonly = (.*?),\n"
738+
r"\s*lineStart = (\d+),\n"
739+
r"\s*columnStart = (\d+),\n"
740+
r"\s*lineEnd = (\d+),\n"
741+
r"\s*columnEnd = (\d+)\n"
742+
r"\s*end OpenModelica\.Scripting\.SourceInfo;,\n"
743+
r"\s*message = \"(.*?)\",\n" # message
744+
r"\s*kind = \.OpenModelica\.Scripting\.ErrorKind\.(.*?),\n" # kind
745+
r"\s*level = \.OpenModelica\.Scripting\.ErrorLevel\.(.*?),\n" # level
746+
r"\s*id = (\d+)", # id
738747
flags=re.MULTILINE | re.DOTALL)
739748

740749
# extract all ErrorMessage records
741750
log_entries = self._re_log_entries.findall(string=error_raw)
742751
for log_entry in reversed(log_entries):
743752
log_raw = self._re_log_raw.findall(string=log_entry)
744-
if len(log_raw) != 1 or len(log_raw[0]) != 5:
753+
if len(log_raw) != 1 or len(log_raw[0]) != 10:
745754
logger.warning("Invalid ErrorMessage record returned by 'getMessagesStringInternal()':"
746755
f" {repr(log_entry)}!")
747756
continue
748757

749-
log_message = log_raw[0][0].encode().decode('unicode_escape')
750-
log_kind = log_raw[0][1]
751-
log_level = log_raw[0][2]
752-
log_id = log_raw[0][3]
758+
log_filename = log_raw[0][0]
759+
log_readonly = log_raw[0][1]
760+
log_lstart = log_raw[0][2]
761+
log_cstart = log_raw[0][3]
762+
log_lend = log_raw[0][4]
763+
log_cend = log_raw[0][5]
764+
log_message = log_raw[0][6].encode().decode('unicode_escape')
765+
log_kind = log_raw[0][7]
766+
log_level = log_raw[0][8]
767+
log_id = log_raw[0][9]
753768

754-
msg = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
755-
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
769+
msg_short = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
770+
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
756771

757772
# response according to the used log level
758773
# see: https://build.openmodelica.org/Documentation/OpenModelica.Scripting.ErrorLevel.html
759774
if log_level == 'error':
760-
raise OMCSessionException(msg)
761-
762-
if log_level == 'warning':
763-
logger.warning(msg)
775+
logger.error(msg_short)
776+
has_error = True
777+
elif log_level == 'warning':
778+
logger.warning(msg_short)
764779
elif log_level == 'notification':
765-
logger.info(msg)
780+
logger.info(msg_short)
766781
else: # internal
767-
logger.debug(msg)
782+
logger.debug(msg_short)
783+
784+
# track all messages such that this list can be reported if an error occurred
785+
msg_long = (f"[{log_kind}:{log_level}:{log_id}] "
786+
f"[{log_filename}:{log_readonly}:{log_lstart}:{log_cstart}:{log_lend}:{log_cend}] "
787+
f"{log_message}")
788+
msg_long_list.append(msg_long)
789+
if has_error:
790+
raise OMCSessionException(f"OMC error occurred for 'sendExpression({command}, {parsed}):\n"
791+
f"{'\n'.join(f"{idx:02d}: {msg}" for idx, msg in enumerate(msg_long_list))}")
768792

769793
if parsed is False:
770794
return result

0 commit comments

Comments
 (0)