Source code for gamspy.exceptions

"""Exception classes for GAMSPy"""

from __future__ import annotations

import os
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from gamspy import Options


[docs] class FatalError(Exception): """Indicates an error that cannot be recovered from. This error should never be caught."""
[docs] class GamspyException(Exception): """ Plain Gamspy exception. This exception can be caught and GAMSPy should be able to continue. Parameters ---------- message : str return_code : int | None """ def __init__(self, message: str, return_code: int | None = None) -> None: super().__init__(message) self.message = message self.return_code = return_code
[docs] class ValidationError(Exception): """An error while validating data."""
[docs] class NeosClientException(Exception): """NeosClient exception."""
[docs] class EngineClientException(Exception): """EngineClient exception"""
[docs] class NeosException(GamspyException): """NEOS Server execution exception"""
[docs] class LatexException(GamspyException): """To latex execution exception"""
[docs] class EngineException(GamspyException): """ GAMS Engine execution exception. Parameters ---------- message : str return_code : int status_code : int | None, optional """ def __init__( self, message: str, return_code: int, status_code: int | None = None, ) -> None: super().__init__(message, return_code) self.status_code = status_code
CHUNK_SIZE = 8 FRAME = "=" * 13 def _parse_errors(lines: list[str], index: int) -> str: error_lines = [lines[index - 1]] temp_index = index try: chunk = lines[temp_index : temp_index + CHUNK_SIZE] while any("****" in err_line for err_line in chunk): error_lines.extend(chunk) temp_index += CHUNK_SIZE chunk = lines[temp_index : temp_index + CHUNK_SIZE] except IndexError: ... error_message = f"\n\n{FRAME}\nError Summary\n{FRAME}\n{''.join(error_lines)}" return error_message.rstrip() def _customize_exception( options: Options, job_name: str, return_code: int | None, ) -> str: error_message = "" if options.write_listing_file is False or return_code is None: return "" if options.listing_file: lst_path = ( options.listing_file if os.path.isabs(options.listing_file) else os.path.join(os.getcwd(), options.listing_file) ) else: lst_path = job_name + ".lst" with open(lst_path, encoding="utf-8") as lst_file: all_lines = lst_file.readlines() num_lines = len(all_lines) index = 0 while index < num_lines: line = all_lines[index] if line.startswith("****"): error_message = _parse_errors(all_lines, index) break index += 1 return error_message