2017-07-21 3 views
0

Je cours un script pour vérifier si les exceptions de pymongo sont interceptées avec succès, mais pour l'instant les seules erreurs que j'obtiens sont des erreurs de Pycharm IDE. J'ai éteint le démon mongo pour tester cela. La partie pertinente du script est la suivante, avec des erreurs IDE suivantes après:Pymongo La gestion des exceptions ne fonctionne pas correctement en python 3

import pymongo 
from pymongo import MongoClient 
from pymongo import errors 
import os 
from os.path import basename 

def make_collection_name(path): 
    filename = os.path.splitext(basename(path))[0] 
    collection_name = filename 
    if collection_name in db.collection_names(): 
     db[collection_name].drop() 
    return collection_name 

if __name__ == '__main__': 

    try: 
     client = MongoClient() 
    except pymongo.errors.ConnectionFailure as e: 
     print("Could not connect to MongoDB: %s") % e 
    except pymongo.errors.ServerSelectionTimeoutError as e: 
     print("Could not connect to MongoDB: %s") % e 
    filepath = **hidden filepath** 
    db = client.TESTDB 

    collection_name = make_collection_name(filepath) 

Au lieu d'avoir les exceptions traitées, je reçois plutôt les erreurs suivantes de l'IDE:

Traceback (most recent call last): 
    File "**hidden path**", line 278, in <module> 
    collection_name = make_collection_name(filepath) 
    File "**hidden path**", line 192, in make_collection_name 
    if collection_name in db.collection_names(): 
    File "C:\Python34\lib\site-packages\pymongo\database.py", line 530, in collection_names 
    ReadPreference.PRIMARY) as (sock_info, slave_okay): 
    File "C:\Python34\lib\contextlib.py", line 59, in __enter__ 
    return next(self.gen) 
    File "C:\Python34\lib\site-packages\pymongo\mongo_client.py", line 859, in _socket_for_reads 
    with self._get_socket(read_preference) as sock_info: 
    File "C:\Python34\lib\contextlib.py", line 59, in __enter__ 
    return next(self.gen) 
    File "C:\Python34\lib\site-packages\pymongo\mongo_client.py", line 823, in _get_socket 
    server = self._get_topology().select_server(selector) 
    File "C:\Python34\lib\site-packages\pymongo\topology.py", line 214, in select_server 
    address)) 
    File "C:\Python34\lib\site-packages\pymongo\topology.py", line 189, in select_servers 
    self._error_message(selector)) 
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] No connection could be made because the target machine actively refused it 

Process finished with exit code 1 

Répondre

2

À partir de PyMongo 3 (pas Python 3, PyMongo 3!), Le constructeur MongoClient ne bloque plus la tentative de connexion au serveur MongoDB. Au lieu de cela, la première opération que vous effectuez attendra la fin de la connexion, puis lancera une exception si la connexion échoue.

http://api.mongodb.com/python/current/migrate-to-pymongo3.html#mongoclient-connects-asynchronously

Comme vous pouvez le voir sur votre trace de la pile, l'exception est levée à partir db.collection_names(), pas de MongoClient(). Donc, envelopper votre appel à make_collection_name dans try/except, pas l'appel MongoClient.