Python 自定义异常处理
经过一番谷歌搜索,终于搞清楚了情况:
我有一个自定义的验证异常,它需要一个请求和一个响应。
class ValidationException(Exception):
message = "Caught Validation Exception"
def __init__(self, request, response):
self.details = {
"request": request,
"response": response
}
super(ValidationException, self).__init__(self.message, self.details)
我有一个异常处理器,当满足某些条件时,它会抛出这个异常的实例:
class handler:
if something:
raise ValidationException(request, response)
这个处理器会在我们在处理一个请求时遇到问题时被调用。
class Poster:
def post(data):
if self.last_response.status_code not in self.valid_post_codes:
self.exception_handler.handleException(self.last_request, self.last_response)
问题是,我抛出了这个验证异常,虽然在追踪信息中看到了它,但似乎没有在我想要的地方被捕获。
def testThis(self):
try:
self.poster.post(json.dumps({}))
except ValidationException:
print "got validation"
except Exception:
print "got exception"
结果是:“捕获到异常”
追踪信息
lib/service/pas/api/order.py line 24 in postOrder
return self.post()
lib/service/base.py line 42 in post
self.exception_handler.handleException(self.last_request, self.last_response)
lib/service/exception/handler.py line 14 in handleException
raise ValidationException(request, response)
ValidationException:
就我所知:
assertRaises(ValidationException, self.poster.post, json.dumps({}))
它也只捕获了异常。有什么想法吗?:\ 任何帮助都非常感谢!提前谢谢!
2 个回答
0
我没法用给出的代码复现这个问题,但有两个地方值得注意:
你似乎在混用旧式类和新式类。这可能会导致一些难以发现的错误。试试用
class Handler(object):
和class Poster(object):
,并确保其他地方的类都是新式类,也就是明确继承自object
的类。你似乎有一个复杂的异常处理机制,
self.exception_handler.handleException(self.last_request, self.last_response)
为什么不直接这样做呢:
raise ValidationException(self.last_request, self.last_repsonse)
至少作为调试实验,去掉或简化那些你不确定的模块、函数和代码,看看能不能直接找到问题。直接切入重点,看看能否修复这个行为。这样做可能会帮助你更好地定位问题所在。如果问题出在处理器上,你可以选择修复它或者直接放弃。
1
好吧好吧好吧...那么,
我的开发工具在我导入的时候加了个前缀“lib”,结果导入了一个叫做Exceptions.ValidationException的东西。
当我在其他地方抛出我自己定义的.ValidationException时,它没有被捕获,因为它不是同一种类型。结果发现还有另一个我不知道的ValidationException...
真是太神奇了,真不是!