LSST Applications g063fba187b+fee0456c91,g0f08755f38+ea96e5a5a3,g1653933729+a8ce1bb630,g168dd56ebc+a8ce1bb630,g1a2382251a+90257ff92a,g20f6ffc8e0+ea96e5a5a3,g217e2c1bcf+937a289c59,g28da252d5a+daa7da44eb,g2bbee38e9b+253935c60e,g2bc492864f+253935c60e,g3156d2b45e+6e55a43351,g32e5bea42b+31359a2a7a,g347aa1857d+253935c60e,g35bb328faa+a8ce1bb630,g3a166c0a6a+253935c60e,g3b1af351f3+a8ce1bb630,g3e281a1b8c+c5dd892a6c,g414038480c+416496e02f,g41af890bb2+afe91b1188,g599934f4f4+0db33f7991,g7af13505b9+e36de7bce6,g80478fca09+da231ba887,g82479be7b0+a4516e59e3,g858d7b2824+ea96e5a5a3,g89c8672015+f4add4ffd5,g9125e01d80+a8ce1bb630,ga5288a1d22+bc6ab8dfbd,gb58c049af0+d64f4d3760,gc28159a63d+253935c60e,gcab2d0539d+3f2b72788c,gcf0d15dbbd+4ea9c45075,gda6a2b7d83+4ea9c45075,gdaeeff99f8+1711a396fd,ge79ae78c31+253935c60e,gef2f8181fd+3031e3cf99,gf0baf85859+c1f95f4921,gfa517265be+ea96e5a5a3,gfa999e8aa5+17cd334064,w.2024.50
LSST Data Management Base Package
Loading...
Searching...
No Matches
wrappers.py
Go to the documentation of this file.
1# This file is part of pex_exceptions.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22__all__ = ["register", "ExceptionMeta", "Exception", "LogicError",
23 "DomainError", "InvalidParameterError", "LengthError",
24 "OutOfRangeError", "RuntimeError", "RangeError", "OverflowError",
25 "UnderflowError", "NotFoundError", "IoError", "TypeError",
26 "translate", "declare"]
27
28import warnings
29import builtins
30
31from . import exceptions
32
33registry = {}
34
35
36def register(cls):
37 """A Python decorator that adds a Python exception wrapper to the registry that maps C++ Exceptions
38 to their Python wrapper classes.
39 """
40 registry[cls.WrappedClass] = cls
41 return cls
42
43
44class ExceptionMeta(type):
45 """A metaclass for custom exception wrappers, which adds lookup of class attributes
46 by delegating to the Swig-generated wrapper.
47 """
48
49 def __getattr__(cls, name):
50 return getattr(cls.WrappedClass, name)
51
52
53@register
54class Exception(builtins.Exception, metaclass=ExceptionMeta):
55 """The base class for Python-wrapped LSST C++ exceptions.
56 """
57
58 # wrappers.py is an implementation detail, not a public namespace, so we pretend this is defined
59 # in the package for pretty-printing purposes
60 __module__ = "lsst.pex.exceptions"
61
62 WrappedClass = exceptions.Exception
63
64 def __init__(self, arg, *args, **kwds):
65 if isinstance(arg, exceptions.Exception):
66 cpp = arg
67 message = cpp.what()
68 else:
69 message = arg
70 cpp = self.WrappedClassWrappedClass(message, *args, **kwds)
71 super(Exception, self).__init__(message)
72 self.cpp = cpp
73
74 def __getattr__(self, name):
75 return getattr(self.cpp, name)
76
77 def __repr__(self):
78 return "%s('%s')" % (type(self).__name__, self.cpp.what())
79
80 def __str__(self):
81 return self.cpp.asString()
82
83
84@register
86 WrappedClass = exceptions.LogicError
87
88
89@register
92
93
94@register
102
103
104@register
107
108
109@register
110class RuntimeError(Exception, builtins.RuntimeError):
112
113
114@register
117
118
119@register
120class OverflowError(RuntimeError, builtins.OverflowError):
122
123
124@register
125class UnderflowError(RuntimeError, builtins.ArithmeticError):
127
128
129@register
130class NotFoundError(Exception, builtins.LookupError):
132
133
134@register
135class IoError(RuntimeError, builtins.IOError):
136 WrappedClass = exceptions.IoError
137
138
139@register
140class TypeError(LogicError, builtins.TypeError):
141 WrappedClass = exceptions.TypeError
142
143
144def translate(cpp):
145 """Translate a C++ Exception instance to Python and return it."""
146 PyType = registry.get(type(cpp), None)
147 if PyType is None:
148 warnings.warn("Could not find appropriate Python type for C++ Exception")
149 PyType = Exception
150 return PyType(cpp)
151
152
153def declare(module, exception_name, base, wrapped_class):
154 """Declare a new exception."""
155 setattr(module, exception_name, register(ExceptionMeta(exception_name, (base, ),
156 dict(WrappedClass=wrapped_class))))
Reports arguments outside the domain of an operation.
Definition Runtime.h:57
Provides consistent interface for LSST exceptions.
Definition Exception.h:107
Reports invalid arguments.
Definition Runtime.h:66
Reports errors in external input/output operations.
Definition Runtime.h:160
Reports attempts to exceed implementation-defined length limits for some classes.
Definition Runtime.h:76
Reports errors in the logical structure of the program.
Definition Runtime.h:46
Reports attempts to access elements using an invalid key.
Definition Runtime.h:151
Reports attempts to access elements outside a valid range of indices.
Definition Runtime.h:89
Reports when the result of an arithmetic operation is too large for the destination type.
Definition Runtime.h:124
Reports when the result of an operation cannot be represented by the destination type.
Definition Runtime.h:115
Reports errors that are due to events beyond the control of the program.
Definition Runtime.h:104
Reports errors from accepting an object of an unexpected or inappropriate type.
Definition Runtime.h:167
Reports when the result of an arithmetic operation is too small for the destination type.
Definition Runtime.h:133
__init__(self, arg, *args, **kwds)
Definition wrappers.py:64
declare(module, exception_name, base, wrapped_class)
Definition wrappers.py:153