是否有 python 向下转型的成语?
Is there a python idiom for downcasting?
我正在编写一个基于 webapp2 框架的网络应用程序。对于我明确抛出的所有错误,我使用一个通用的基本异常,比如
class MyBaseException(Exception):
def __init__(self, status, code, message):
self.status_code = status
self.error_code = code
self.error_message = message
并有一个 BaseRequestHandler
输出一个简单的 JSON 错误响应,对于意外异常默认为 500/Generic 错误。
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
支票在我看来很难看,所以我认为必须有更好的方法。建议?
编辑这和向下转型有什么关系?
在我的 "native" 语言 java 中,我会做类似
的事情
MyBaseException b = (MyBaseException) e;
JSONObject j = new JSONObject();
j.put("error_code", e.getCode());
j.put("error_message", e.getErrorMessage());
...
但是 python 没有明确的类型转换,所以...是否可以做类似的事情?
通常的 Python 习惯用法是完全忽略对象的 class,所以您只需这样做:
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.
我正在编写一个基于 webapp2 框架的网络应用程序。对于我明确抛出的所有错误,我使用一个通用的基本异常,比如
class MyBaseException(Exception):
def __init__(self, status, code, message):
self.status_code = status
self.error_code = code
self.error_message = message
并有一个 BaseRequestHandler
输出一个简单的 JSON 错误响应,对于意外异常默认为 500/Generic 错误。
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
支票在我看来很难看,所以我认为必须有更好的方法。建议?
编辑这和向下转型有什么关系?
在我的 "native" 语言 java 中,我会做类似
的事情MyBaseException b = (MyBaseException) e;
JSONObject j = new JSONObject();
j.put("error_code", e.getCode());
j.put("error_message", e.getErrorMessage());
...
但是 python 没有明确的类型转换,所以...是否可以做类似的事情?
通常的 Python 习惯用法是完全忽略对象的 class,所以您只需这样做:
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.