【问题标题】:Checking for the return value of a function in Python在 Python 中检查函数的返回值
【发布时间】:2015-10-21 08:32:13
【问题描述】:

我在Django中有一个用于数据库连接的小功能如下:

def db_connection(query_name):
    try:
        cursor = connection.cursor()
        cursor.execute(query_name)
        descr = cursor.description
        rows = cursor.fetchall()
        result = [dict(zip([column[0] for column in descr], row)) for row in rows]
        return result
    except Exception as e:
        return e 
    finally:
       cursor.close()

这个函数在我的函数视图中用于Django rest框架执行SQL查询。一般语法如下:

@api_view(['GET'])
def foo_bar(request):
    ....
    ....
    ....
    query1 = "Select name from table"
    result = db_connection(query1)

    return Response(result, status=status.HTTP_200_OK)

但是,我需要根据我的 db_connection 函数的返回值更改响应元组中的状态值,即如果没有异常发生则返回 200 OK,否则返回 500。如何检查返回值是否函数是异常?

【问题讨论】:

  • Django 有一个非常好的访问数据库的框架。你不使用它有什么原因吗?
  • 我很清楚通过 ORM.. 像手动处理防止 sql 注入的处理来命名其中之一..但是..这个应用程序是一个分析应用程序和 Django ORM只是不足以满足我的需求,因此原始 SQL ..

标签: python django function exception-handling django-rest-framework


【解决方案1】:

您明确地绕过了异常已经为您提供的所有良好控制流。不要那样做。

如果您只想返回 500,则根本不要捕获异常;让它冒泡,Django 的异常处理中间件会捕获它并返回 500 响应。

在任何情况下,您都不应该捕获基类 Exception ;只抓住你实际可以处理的事情。当你确实捕获了一个异常时,你应该实际上处理它;归还它而不是提高它是没有任何用处的。

【讨论】:

  • hmm..有道理..所以正确的做法是只使用 try 块而不使用 except 语句,然后最后关闭连接?
  • 不要在你的函数中使用try... finally,使用光标作为上下文管理器docs.djangoproject.com/en/1.8/topics/db/sql/…
【解决方案2】:

我会将foo_bar 函数中的try catch 块移到result = db_connection(query1) 代码上,并从那里返回500 状态,以及某种错误字典,其中包含解释失败原因的消息。我这样说是因为我假设您正在制作一个 REST API,它必须始终返回答案并且不会以正常的 django 方式崩溃。

【讨论】:

  • 但是这会破坏我首先创建 db_connection 函数的目的..我有多个视图,并且更喜欢使用单行函数调用而不是整个 try catch 块..
  • 你可以试试isinstance(result, Exception),见docs.python.org/2/library/functions.html#isinstance
  • 我不确定如果您不处理异常并让它冒泡,行为会如何。
  • 是的..我完全明白你在说什么..这是一个休息 API,我想确切地知道返回的响应,而不是框架抛出错误
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2012-08-19
  • 2015-06-21
  • 2010-09-21
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多