LSSTApplications  19.0.0-10-g4a5fae6+3,19.0.0-10-g920eed2,19.0.0-11-g48a0200+2,19.0.0-18-gfc4e62b+16,19.0.0-2-g3b2f90d+2,19.0.0-2-gd671419+6,19.0.0-20-g5a5a17ab+14,19.0.0-21-g2644856+17,19.0.0-24-g0913cb1,19.0.0-24-g878c510+4,19.0.0-25-g6c8df7140+1,19.0.0-25-gb330496+4,19.0.0-3-g2b32d65+6,19.0.0-3-g8227491+15,19.0.0-3-g9c54d0d+15,19.0.0-3-gca68e65+11,19.0.0-3-gcfc5f51+6,19.0.0-3-ge110943+14,19.0.0-3-ge74d124,19.0.0-30-g9c3fd16+5,19.0.0-4-g06f5963+6,19.0.0-4-g10df615,19.0.0-4-g3d16501+17,19.0.0-4-g4a9c019+6,19.0.0-4-g5a8b323,19.0.0-4-g66397f0+1,19.0.0-4-g8557e14,19.0.0-4-g8964aba+16,19.0.0-4-ge404a01+15,19.0.0-5-g40f3a5a,19.0.0-5-g4db63b3,19.0.0-5-gb9eeb60,19.0.0-5-gfb03ce7+16,19.0.0-6-gbaebbfb+15,19.0.0-61-gec4c6e08+5,19.0.0-7-g039c0b5+15,19.0.0-7-gbea9075+4,19.0.0-7-gc567de5+16,19.0.0-72-g37abf38+2,19.0.0-9-g463f923+15,v20.0.0.rc1
LSSTDataManagementBasePackage
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 
28 import warnings
29 import builtins
30 
31 from . import exceptions
32 
33 registry = {}
34 
35 
36 def 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 
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
54 class 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.WrappedClass(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
91  WrappedClass = exceptions.DomainError
92 
93 
94 @register
97 
98 
99 @register
101  WrappedClass = exceptions.LengthError
102 
103 
104 @register
107 
108 
109 @register
110 class RuntimeError(Exception, builtins.RuntimeError):
111  WrappedClass = exceptions.RuntimeError
112 
113 
114 @register
116  WrappedClass = exceptions.RangeError
117 
118 
119 @register
120 class OverflowError(RuntimeError, builtins.OverflowError):
122 
123 
124 @register
125 class UnderflowError(RuntimeError, builtins.ArithmeticError):
127 
128 
129 @register
130 class NotFoundError(Exception, builtins.LookupError):
132 
133 
134 @register
135 class IoError(RuntimeError, builtins.IOError):
136  WrappedClass = exceptions.IoError
137 
138 
139 @register
140 class TypeError(LogicError, builtins.TypeError):
141  WrappedClass = exceptions.TypeError
142 
143 
144 def 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 
153 def 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))))
lsst::pex::exceptions.wrappers.UnderflowError
Definition: wrappers.py:125
lsst::pex::exceptions.wrappers.register
def register(cls)
Definition: wrappers.py:36
lsst::pex::exceptions.wrappers.LogicError
Definition: wrappers.py:85
lsst::pex::exceptions.wrappers.InvalidParameterError
Definition: wrappers.py:95
lsst::pex::exceptions::UnderflowError
Reports when the result of an arithmetic operation is too small for the destination type.
Definition: Runtime.h:133
lsst::pex::exceptions::NotFoundError
Reports attempts to access elements using an invalid key.
Definition: Runtime.h:151
lsst::pex::exceptions::RangeError
Reports when the result of an operation cannot be represented by the destination type.
Definition: Runtime.h:115
lsst::pex::exceptions.wrappers.IoError
Definition: wrappers.py:135
lsst::pex::exceptions.wrappers.Exception.cpp
cpp
Definition: wrappers.py:72
lsst::pex::exceptions.wrappers.RangeError
Definition: wrappers.py:115
lsst::pex::exceptions.wrappers.NotFoundError
Definition: wrappers.py:130
lsst::pex::exceptions.wrappers.ExceptionMeta.__getattr__
def __getattr__(cls, name)
Definition: wrappers.py:49
lsst::pex::exceptions.wrappers.Exception.WrappedClass
WrappedClass
Definition: wrappers.py:62
lsst::pex::exceptions::DomainError
Reports arguments outside the domain of an operation.
Definition: Runtime.h:57
lsst::pex::exceptions::LengthError
Reports attempts to exceed implementation-defined length limits for some classes.
Definition: Runtime.h:76
lsst::pex::exceptions::OverflowError
Reports when the result of an arithmetic operation is too large for the destination type.
Definition: Runtime.h:124
lsst::pex::exceptions.wrappers.RuntimeError
Definition: wrappers.py:110
lsst::pex::exceptions::LogicError
Reports errors in the logical structure of the program.
Definition: Runtime.h:46
lsst::pex::exceptions.wrappers.OverflowError
Definition: wrappers.py:120
lsst::pex::exceptions::IoError
Reports errors in external input/output operations.
Definition: Runtime.h:160
lsst::pex::exceptions.wrappers.Exception.__repr__
def __repr__(self)
Definition: wrappers.py:77
lsst::pex::exceptions.wrappers.DomainError
Definition: wrappers.py:90
lsst::pex::exceptions::InvalidParameterError
Reports invalid arguments.
Definition: Runtime.h:66
lsst::pex::exceptions.wrappers.ExceptionMeta
Definition: wrappers.py:44
lsst::pex::exceptions.wrappers.OutOfRangeError
Definition: wrappers.py:105
lsst::pex::exceptions.wrappers.Exception.__str__
def __str__(self)
Definition: wrappers.py:80
type
table::Key< int > type
Definition: Detector.cc:163
lsst::pex::exceptions::OutOfRangeError
Reports attempts to access elements outside a valid range of indices.
Definition: Runtime.h:89
lsst::pex::exceptions.wrappers.Exception.__getattr__
def __getattr__(self, name)
Definition: wrappers.py:74
lsst::pex::exceptions::Exception
Provides consistent interface for LSST exceptions.
Definition: Exception.h:107
lsst::pex::exceptions.wrappers.declare
def declare(module, exception_name, base, wrapped_class)
Definition: wrappers.py:153
lsst::pex::exceptions::TypeError
Reports errors from accepting an object of an unexpected or inappropriate type.
Definition: Runtime.h:167
lsst::pex::exceptions.wrappers.LengthError
Definition: wrappers.py:100
lsst::pex::exceptions.wrappers.translate
def translate(cpp)
Definition: wrappers.py:144
lsst::pex::exceptions.wrappers.Exception
Definition: wrappers.py:54
lsst::pex::exceptions.wrappers.TypeError
Definition: wrappers.py:140
lsst::pex::exceptions::RuntimeError
Reports errors that are due to events beyond the control of the program.
Definition: Runtime.h:104
lsst::pex::exceptions.wrappers.Exception.__init__
def __init__(self, arg, *args, **kwds)
Definition: wrappers.py:64