Python 3是否尝试/除最佳实践?

问题描述

这是关于代码结构而不是语法的问题。我想知道什么是最佳做法,为什么。

想象一下您有一个python程序。您有一个像这样的主班:

import my_db_manager as dbm

def main_loop():
   people = dbm.read_db()
   #Todo: Write rest of programme doing something with the data from people...
    

if __name__ == '__main__':
    main_loop()

然后,您有几个单独的.py文件,用于管理与数据库中各种表的交互。这些{.1 {.1}}文件是这样的:

my_db_manager

在上面的示例中,函数def read_db(): people = [] db = connection_manager.get_connection() cursor = db.cursor() try: #Database reading statement sql = 'SELECT disTINCT(name) FROM people' cursor.execute(sql) results = cursor.fetchall() people = [x[0] for x in results] except Exception as e: print(f'Error: {e}') finally: return people 是从主类中的read_db()调用的。 main_loop()包含try / except子句,用于管理与数据库交互时的错误。尽管这可以正常工作,但可以在调用read_db()时将try / except子句放在main_loop()中。它们可以同样位于两个地方。使用try / except时,什么是“最佳实践”?在read_db()中使用try / except还是在管理程序逻辑流的db_manager中使用它,还是在两个地方都使用它?请记住,我正在给出上面的特定示例,但是我试图推断编写python时应用try / except的一般规则。

解决方法

在Python或其他任何地方编写try-except的最佳方法是尽可能地狭窄。捕获比您打算处理的更多的异常是一个常见的问题! (积分:This Answer

在您的特定情况下,当然在函数内部。它:

a)为主线程从db错误创建抽象 b)消除了对db错误的怀疑,以防万一其他原因导致主线程内部发生异常(尽管您可以看到,但仍然会抓住最后的机会) c)使您能够在一处处理所有与数据库有关的错误。高效和创新。您将如何在主线程的函数之外创建列表people。它将变成一团糟。

最后,即使在函数可能发生异常的每个地方提供服务时,即使在函数内部,您也应坚持这种简约性:

def read_db():
    #Database reading statement 
    sql = 'SELECT DISTINCT(name) FROM people'
    try:
        db = connection_manager.get_connection()
        cursor = db.cursor()
        cursor.execute(sql)
        results = cursor.fetchall()
    except Exception as e:
        print(f'Error: {e}')
        return []
    else:
        return [x[0] for x in results]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...