Python自定义异常处理

时间:2014-10-30 20:03:18

标签: python custom-exceptions

经过多次googli搜索以了解最新情况,这里是:

我有一个自定义验证异常,它接受请求和响应

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)

问题是,我正在提出ValidationException,在我的追溯中获取它,但是,它似乎没有被捕获到我想要的地方。

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 :(得分:1)

很好......所以..

我的IDE以" lib"为我的导入前缀导入了Exceptions.ValidationException。

当我将my.own.ValidationException抛出到其他地方时,它并没有被捕获,因为它不是同一类型。事实证明,碰巧是另一个我不知道的ValidationException ......

太奇怪了,不是!

答案 1 :(得分:0)

我无法用给出的代码复制它,但需要考虑两个可疑的地方:

  1. 您似乎在混合旧式和新式课程。这可能导致微妙的错误。尝试class Handler(object):class Poster(object):,并在所有其他实例中创建新类型的类,它们是object的显式子类。

  2. 您似乎有一个复杂的异常调用机制,

    self.exception_handler.handleException(self.last_request, self.last_response)
    

    为什么不呢:

    raise ValidationException(self.last_request, self.last_repsonse)
    
    好吗?至少作为调试实验,删除或短路您不确定或不能阻止工作的模块,功能和代码。切入追逐,看看你是否可以解决这个问题。至少,它可以帮助您缩小问题的范围。如果它在处理程序中,您可以选择修复它或者将其丢弃。