Python 自定义异常处理

1 投票
2 回答
1325 浏览
提问于 2025-04-30 17:23

经过一番谷歌搜索,终于搞清楚了情况:

我有一个自定义的验证异常,它需要一个请求和一个响应。

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

我没法用给出的代码复现这个问题,但有两个地方值得注意:

  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)
    

    至少作为调试实验,去掉或简化那些你不确定的模块、函数和代码,看看能不能直接找到问题。直接切入重点,看看能否修复这个行为。这样做可能会帮助你更好地定位问题所在。如果问题出在处理器上,你可以选择修复它或者直接放弃。

1

好吧好吧好吧...那么,

我的开发工具在我导入的时候加了个前缀“lib”,结果导入了一个叫做Exceptions.ValidationException的东西。

当我在其他地方抛出我自己定义的.ValidationException时,它没有被捕获,因为它不是同一种类型。结果发现还有另一个我不知道的ValidationException...

真是太神奇了,真不是!

撰写回答