是否存在用于向下转换的蟒蛇成语?

时间:2016-03-03 08:58:08

标签: python casting webapp2 downcast

我正在编写基于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没有明确的类型转换,所以......是否可以做类似的事情?

1 个答案:

答案 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.