mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-21 14:35:27 -04:00
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
from ctypes import c_int, c_char
|
|
from warnings import warn
|
|
|
|
import openmc.exceptions as exc
|
|
from . import _dll
|
|
|
|
|
|
def _error_handler(err, func, args):
|
|
"""Raise exception according to error code."""
|
|
|
|
# Get error code corresponding to global constant.
|
|
def errcode(s):
|
|
return c_int.in_dll(_dll, s).value
|
|
|
|
# Get error message set by OpenMC library
|
|
errmsg = (c_char*256).in_dll(_dll, 'openmc_err_msg')
|
|
msg = errmsg.value.decode()
|
|
|
|
# Raise exception type corresponding to error code
|
|
if err == errcode('OPENMC_E_ALLOCATE'):
|
|
raise exc.AllocationError(msg)
|
|
elif err == errcode('OPENMC_E_OUT_OF_BOUNDS'):
|
|
raise exc.OutOfBoundsError(msg)
|
|
elif err == errcode('OPENMC_E_INVALID_ARGUMENT'):
|
|
raise exc.InvalidArgumentError(msg)
|
|
elif err == errcode('OPENMC_E_INVALID_TYPE'):
|
|
raise exc.InvalidTypeError(msg)
|
|
if err == errcode('OPENMC_E_INVALID_ID'):
|
|
raise exc.InvalidIDError(msg)
|
|
elif err == errcode('OPENMC_E_GEOMETRY'):
|
|
raise exc.GeometryError(msg)
|
|
elif err == errcode('OPENMC_E_DATA'):
|
|
raise exc.DataError(msg)
|
|
elif err == errcode('OPENMC_E_PHYSICS'):
|
|
raise exc.PhysicsError(msg)
|
|
elif err == errcode('OPENMC_E_WARNING'):
|
|
warn(msg)
|
|
elif err < 0:
|
|
if not msg:
|
|
msg = f"Unknown error encountered (code {err})."
|
|
raise exc.OpenMCError(msg)
|