简体   繁体   English

如何在try-except语句中正确处理Pyodbc错误

[英]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. 当前,当任何错误包含在err子句之外时,我的单元测试就会通过。

I suspect that I'm not constructing the try-except statement properly to catch the correct error. 我怀疑我没有正确构造try-except语句来捕获正确的错误。 With pyodbc, I'm specifically attempting to catch an error called 'pyodbc.Error', but currently all errors cause the test to pass. 对于pyodbc,我专门尝试捕获一个称为“ pyodbc.Error”的错误,但当前所有错误都会导致测试通过。

I want the test to fail unless the error being raised is the one specified in the except clause. 我希望测试失败,除非引发的错误是except子句中指定的错误。 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. 这是一个工作示例,似乎捕获了非pyodbc.Error错误。 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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