简体   繁体   中英

How to handle pyodbc error properly in a try-except statement

I want to know that I'm handling an exception that is raised only when the path to my database is incorrect, and correctly raising only that error is reflected in the passing or failing for my test for the function. Currently, my unit test passes when any error is included in the except as err clause.

I suspect that I'm not constructing the try-except statement properly to catch the correct error. With pyodbc, I'm specifically attempting to catch an error called 'pyodbc.Error', but currently all errors cause the test to pass.

I want the test to fail unless the error being raised is the one specified in the except clause. I do not want to have a "catch all" try-except.

def get_database():
    try:
        conn = pyodbc.connect(
            r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
            r'DBQ=M:\Path\To\Database\My_Database.accdb;'
        )
        return conn
    except pyodbc.Error as err: # Only error I wanted passed for the test!
        raise err

@mock.patch('directory1.script1.pyodbc.connect')
def test_invalid_path_to_database(self, mock_conn):
    mock_conn.side_effect = pyodbc.Error

    # Passes no matter what exception is included in except clause!
    self.assertRaises(pyodbc.Error, get_database)  

Here is a working example that seems to catch non pyodbc.Error errors. Can you clarify what you're trying to do?

import pyodbc
import unittest
import mock

def get_database():
    try:
        conn = pyodbc.connect(
            r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
            r'DBQ=M:\Path\To\Database\My_Database.accdb;'
        )
        return conn
    except pyodbc.Error as err: # Only error I wanted passed for the test!
        raise ValueError('Non pyodbc error')

class Test(unittest.TestCase):
    @mock.patch('pyodbc.connect')
    def test_invalid_path_to_database(self, mock_conn):
        mock_conn.side_effect = pyodbc.Error

        self.assertRaises(pyodbc.Error, get_database)

if __name__ == '__main__':
    unittest.main()

With output

Traceback (most recent call last):
  File "/Users/henry/projects/stack/.venv/lib/python3.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "example.py", line 21, in test_invalid_path_to_database
    self.assertRaises(pyodbc.Error, get_database)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 743, in assertRaises
    return context.handle('assertRaises', args, kwargs)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 178, in handle
    callable_obj(*args, **kwargs)
  File "example.py", line 13, in get_database
    raise ValueError('Non pyodbc error')
ValueError: Non pyodbc error

----------------------------------------------------------------------
Ran 1 test in 0.002s

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM