49 lines
1.0 KiB
Python
49 lines
1.0 KiB
Python
class InvalidTypeError(Exception):
|
|
def __init__(self, value, code, detail, *args) -> None:
|
|
super().__init__(value, *args)
|
|
self.code = code
|
|
self.detail = detail
|
|
|
|
def __repr__(self) -> str:
|
|
return self.detail
|
|
|
|
|
|
def check(v, klass):
|
|
klass_names = [k.__name__ for k in klass]
|
|
|
|
if not isinstance(v, tuple(klass)):
|
|
raise InvalidTypeError(
|
|
f"{v.__class__.__name__} class is unknown, use {klass_names}.",
|
|
code=500,
|
|
detail={"value": v, "type": v.__class__.__name__},
|
|
)
|
|
return v
|
|
|
|
|
|
def add(a, b):
|
|
klass = [int, float]
|
|
try:
|
|
a = check(a, klass)
|
|
b = check(b, klass)
|
|
except InvalidTypeError as e:
|
|
error = {
|
|
"name": InvalidTypeError.__name__,
|
|
"code": e.code,
|
|
"detail": e.detail,
|
|
}
|
|
raise TypeError(error) from e
|
|
|
|
return a + b
|
|
|
|
|
|
def main():
|
|
|
|
try:
|
|
print(add(1, "2"))
|
|
except TypeError as e:
|
|
print(e.args)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|