我正在编写基于webapp2框架的Web应用程序。我对我明确抛出的所有错误使用了一个共同的基本异常,比如
class MyBaseException(Exception):
def __init__(self, status, code, message):
self.status_code = status
self.error_code = code
self.error_message = message
并有BaseRequestHandler
输出错误的简单JSON响应,默认为意外异常的500 /通用错误。
class BaseHandler(webapp2.RequestHandler):
def handle_exception(self, e, debug):
logger.exception(e)
status = e.status_code if isinstance(e, MyBaseException) else 500
code = e.error_code if isinstance(e, MyBaseException) else 'GENERIC_ERROR'
message = e.error_message if isinstance(e, MyBaseException) else 'Blah blah blah'
self.response.set_status(status)
self.response.content_type = 'application/json'
self.response.write(json.encode({"code": code, "message": message})
那些isinstance
支票看起来很难看,所以我认为必须有更好的方法。建议?
编辑这与预告有什么关系?
在java中,我的" native"语言,我做了类似
的事情MyBaseException b = (MyBaseException) e;
JSONObject j = new JSONObject();
j.put("error_code", e.getCode());
j.put("error_message", e.getErrorMessage());
...
但是python没有明确的类型转换,所以......是否可以做类似的事情?
答案 0 :(得分:2)
通常的Python习惯用法是完全忽略对象的类,所以你只是这样做:
status = e.status_code
code = e.error_code
message = e.error_message
这称为duck typing。
如果你可能需要处理其他类型的异常(在你的Java示例中,你得到ClassCastException
),标准的Python习惯就是将整个事物包装起来......捉:
try:
status = e.status_code
etc.
catch AttributeError: # i.e. e doesn't have one of the listed attributes
status = "500"
etc.