2013-11-03 3 views
1
#some code 

@tornado.gen.engine 
def do_insert(): 
    result = yield motor.Op(db.test_collection.insert, {'_id': 1}) 

try: 
    do_insert() 
except: 
    print "error" 

#some code 

Я пробовал код вроде этого. База данных - mongodb. В первый раз, когда я запускаю его, он правильно вставляет данные. Во второй раз, когда я запускаю его, он должен иметь исключение и печатать «ошибку». Но он разбился, а не «ошибка» печати.Как я могу поймать исключение, когда я использую мотор для вставки данных?

ответ

1

do_insert is асинхронный функция; это означает, что вызов его запускает какую-то задачу, но он не заканчивается сразу, и, вероятно, он не будет завершен к моменту его возвращения. Чтобы увидеть результат (если он вернул что-либо) или исключение (если оно не выполнено), вам нужно дождаться его завершения. Обычно это означает, что вам нужен «доход» на сайте вызова (и так далее, вплоть до стека). На верхнем уровне вам нужно запустить IOLoop: в пакетном стиле вы, вероятно, захотите использовать IOLoop.run_sync; на долговременном сервере вместо этого вы будете использовать IOLoop.start. Ваш пример будет (обратите внимание на использование gen.coroutine вместо gen.engine, это лучше работает с run_sync):

@tornado.gen.coroutine 
def do_insert(): 
    result = yield motor.Op(db.test_collection.insert, {'_id': 1}) 

try: 
    IOLoop.instance().run_sync(do_insert()) 
except: 
    print "error" 
0

Я ловлю ошибку в пределах упакованного метода вставки, и это работает для меня:

@tornado.gen.engine 
def do_insert(): 
    try: 
     result = yield motor.Op(db.test_collection.insert, {'_id': 1}) 
    except: 
     <you should log here>