1. 배경
api를 개발하는데, 어떤 이유에서의 에러를 제대로 반환해야 한다. 제대로된 에러는 에러코드와 에러 메세지를 지닌다. (15개의 유명서비스 에러 레스폰스 포맷 : https://valuefactory.tistory.com/550)
하지만, 어플에서 사용하는 라이브러리에서 에러를 발생할시, 메세지는 반환하지만 네트워크 통신이 아니기 때문에 에러코드를 반환하지는 않는다. 따라서 에러가 예상되는 곳을 try ~ catch(except)로 잘 묶고, 그 에러에 해당하는 에러 메세지를 할당할 필요가 있다.
아래는 그에 대한 해답으로 아래의 stackoverflow의 답변을 참고하길 바란다.
요약하면, custom화된 Error를 가령 ErrorWithCode가 Exception을 상속하게 한후, ErrorWithCode 클래스 내에 code와 msg를 담는 변수를 두면, code와 msg를 모두 담는 ErrorWithCode를 생성할 수 있다.
class AppError(Exception):
pass
class MissingInputError(AppError):
pass
class ValidationError(AppError):
pass
...
def validate(self):
""" Validate Input and save it """
params = self.__params
if 'key' in params:
self.__validateKey(escape(params['key'][0]))
else:
raise MissingInputError
if 'svc' in params:
self.__validateService(escape(params['svc'][0]))
else:
raise MissingInputError
if 'dt' in params:
self.__validateDate(escape(params['dt'][0]))
else:
raise MissingInputError
def __validateMulti(self, m):
""" Validate Multiple Days Request"""
if m not in Input.__validDays:
raise ValidationError
self.__dCast = int(m)
validate() and __validateMulti() are methods of a class that validates and store the passed input parameters. As is evident in the code, I raise some custom exceptions when some input parameter is missing or some validation fails.
I'd like to define some custom error codes and error messages specific to my app like,
Error 1100: "Key parameter not found. Please verify your input."
Error 1101: "Date parameter not found. Please verify your input"
...
Error 2100: "Multiple Day parameter is not valid. Accepted values are 2, 5 and 7."
and report the same to the user.
- How do I define these error codes and error messages in the custom exceptions?
- How do I raise / trap exception in a way that I know what error code / message to display?
(P.S: This is for Python 2.4.3).
Bastien Léonard mentions in this SO comment that you don't need to always define a new __init__
or __str__
; by default, arguments will be placed in self.args and they will be printed by __str__
.
Thus, the solution I prefer:
class AppError(Exception): pass
class MissingInputError(AppError):
# define the error codes & messages here
em = {1101: "Some error here. Please verify.", \
1102: "Another here. Please verify.", \
1103: "One more here. Please verify.", \
1104: "That was idiotic. Please verify."}
Usage:
try:
# do something here that calls
# raise MissingInputError(1101)
except MissingInputError, e
print "%d: %s" % (e.args[0], e.em[e.args[0]])
答えが見つからない?日本語で聞いてみましょう。
Here's a quick example of a custom Exception
class with special codes:
class ErrorWithCode(Exception):
def __init__(self, code):
self.code = code
def __str__(self):
return repr(self.code)
try:
raise ErrorWithCode(1000)
except ErrorWithCode as e:
print("Received error with code:", e.code)
Since you were asking about how to use args
here's an additional example...
class ErrorWithArgs(Exception):
def __init__(self, *args):
# *args is used to get a list of the parameters passed in
self.args = [a for a in args]
try:
raise ErrorWithArgs(1, "text", "some more text")
except ErrorWithArgs as e:
print("%d: %s - %s" % (e.args[0], e.args[1], e.args[2]))
'C Lang > Python Program Diary' 카테고리의 다른 글
파이썬 Exception hierarchy (0) | 2019.06.27 |
---|---|
파이썬 에러처리 베스트프렉티스 (0) | 2019.06.27 |
파이썬에서 JSON의 decoding과 encoding은 어떻게 할까? json.load, json.dumps. (0) | 2019.06.26 |
클래스 vs 함수, 파이썬에서는 클래스를 사용하면 어떤 점이 좋을까? (1) | 2019.06.26 |
Python’s Requests Library (Guide) (0) | 2019.06.19 |
*args
with**kwargs
you can define argument values by keyword. Example:message="File not found", errorcode="10"
– Steven M. Vascellaro Feb 6 '18 at 19:08