2014-10-30 8 views
1

После долгого googli поиска, чтобы выяснить, что происходит, вот это: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) 

Проблема в том, что я поднимаю исключение 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({})) 

только ловит исключение, а также. Есть идеи? : \ Любая помощь очень ценится! Заранее спасибо

ответ

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) 
    

    прямо там? По крайней мере, в качестве эксперимента для отладки, удалите или короткозамкнутые модули, функции и код, о которых вы не уверены или не можете работать. Отрежьте преследование, посмотрите, можете ли вы исправить это поведение. По крайней мере, это может помочь вам сузить проблему. Если он находится в обработчике, вы можете выбрать либо исправить его, либо вытолкнуть его.

+0

Большое спасибо за помощь! – mikeyseay

1

Ну хорошо хорошо ... Так ..

Мой IDE приставкой мой импорт с "Lib", который импортируется Exceptions.ValidationException.

Когда я бросаю my.own.ValidationException в другом месте, он не был пойман, поскольку он не был того же типа. Так получилось, что случилось еще одно ValidationException, о котором я не знал ...

Thats amazing, NOT!