Python-MySQL 中的错误处理

2024-01-28

我正在运行一个基于 python Flask 的小型 Web 服务,我想在其中执行一个小型 MySQL 查询。当我获得 SQL 查询的有效输入时,一切都按预期工作,并且我得到了正确的值。但是,如果该值未存储在数据库中,我会收到一个TypeError

    Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1478, in full_dispatch_request
    response = self.make_response(rv)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1566, in make_response
    raise ValueError('View function did not return a response')
ValueError: View function did not return a response

我尝试自己利用错误处理并在我的项目中使用此代码,但似乎这无法正常工作。

#!/usr/bin/python

from flask import Flask, request
import MySQLdb

import json

app = Flask(__name__)


@app.route("/get_user", methods=["POST"])
def get_user():
    data = json.loads(request.data)
    email = data["email"]

    sql = "SELECT userid FROM oc_preferences WHERE configkey='email' AND configvalue LIKE '" + email + "%';";

    conn = MySQLdb.connect( host="localhost",
                            user="root",
                            passwd="ubuntu",
                            db="owncloud",
                            port=3306)
    curs = conn.cursor()

    try:
        curs.execute(sql)
        user = curs.fetchone()[0]
        return user
    except MySQLdb.Error, e:
        try:
            print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])
            return None
        except IndexError:
            print "MySQL Error: %s" % str(e)
            return None
    except TypeError, e:
        print(e)
        return None
    except ValueError, e:
        print(e)
        return None
    finally:
        curs.close()
        conn.close()

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

基本上,当一切正常工作时,我只想返回一个值,如果我的服务器上没有错误消息,我不想返回任何内容。如何以正确的方式使用错误处理?

EDIT更新了当前代码+错误消息。


第一点:你的 try/ except 块中有太多代码。当您有两个可能引发不同错误的语句(或两组语句)时,最好使用不同的 try/ except 块:

try:
    try:
        curs.execute(sql)
        # NB : you won't get an IntegrityError when reading
    except (MySQLdb.Error, MySQLdb.Warning) as e:
        print(e)
        return None

    try: 
        user = curs.fetchone()[0]
        return user
    except TypeError as e:
        print(e)
        return None

finally:
    conn.close()

现在你真的必须在这里捕获 TypeError 吗?如果您阅读回溯,您会注意到您的错误来自调用__getitem__() on None (nb : __getitem__()是下标运算符的实现[]),这意味着如果没有匹配的行cursor.fetchone()回报None,所以你可以测试返回currsor.fetchone():

try:
    try:
        curs.execute(sql)
        # NB : you won't get an IntegrityError when reading
    except (MySQLdb.Error, MySQLdb.Warning) as e:
        print(e)
        return None

    row = curs.fetchone()
    if row:
        return row[0]
    return None

finally:
    conn.close()

现在你真的需要在这里捕获 MySQL 错误吗?你的查询应该经过良好的测试,它只是一个读取操作,所以它不应该崩溃 - 所以如果你在这里出了问题,那么你显然有一个更大的问题,你不想把它隐藏在地毯下。 IOW:要么记录异常(使用标准logging包装和logger.exception())并重新引发它们或更简单地让它们传播(并最终让更高级别的组件负责记录未处理的异常):

try:
    curs.execute(sql)
    row = curs.fetchone()
    if row:
        return row[0]
    return None

finally:
    conn.close()

最后:构建 sql 查询的方式是完全不安全 http://bobby-tables.com/。使用 sql 占位符代替:

q = "%s%%" % data["email"].strip() 
sql = "select userid from oc_preferences where configkey='email' and configvalue like %s"
cursor.execute(sql, [q,])

哦,是的:wrt/“视图函数没有返回响应”ValueError,这是因为,好吧,你的视图返回None在很多地方。 Flask 视图应该返回可用作 HTTP 响应的内容,并且None此处不是有效选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python-MySQL 中的错误处理 的相关文章

  • 以 str.format 切片字符串

    我想实现以下目标str format x y 1234 5678 print str x 2 str y 2 我能够做到这一点的唯一方法是 print 0 1 format str x 2 str y 2 现在 这是一个例子 我真正拥有的是
  • Pytorch - 推断线性层 in_features

    我正在构建一个玩具模型来获取一些图像并进行分类 我的模型看起来像 conv2d gt pool gt conv2d gt linear gt linear 我的问题是 当我们创建模型时 我们必须计算第一个线性层的大小in features基
  • 如何使用playsound模块停止音频?

    如何在Python代码中通过playaudio模块停止音频播放 我播放过音乐 但我无法停止音乐 我怎样才能阻止它 playsound playsound name of file 您可以使用多处理模块将声音作为后台进程播放 然后随时终止它
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • 将 2D Panda 的 DataFrame 列表转换为 3D DataFrame

    我正在尝试创建一个将标签值保存到 2D DataFrame 的 Pandas DataFrame 这是我到目前为止所做的 我正在使用读取 csv 文件pd read csv并将它们附加到列表中 出于这个问题的目的 让我们考虑以下代码 imp
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 如何将嵌套的Python字典转换为简单的命名空间?

    假设我有一个深度为 N 的嵌套字典 如何将每个内部嵌套字典转换为简单的命名空间 example input key0a test key0b key1a key2a keyNx key2b test key1b test example o
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • 如何从 Python 3.5 降级到 3.4

    我想安装 kivy 链接在这里 https kivy org docs installation installation windows html install win dist 用于项目 但是 当尝试使用 pip 安装它所依赖的包时
  • 保存游戏最高分?

    我使用 pygame 在 python 中制作了一个非常简单的游戏 分数取决于玩家达到的级别 我将级别作为变量称为score 我想在游戏开始或结束时显示顶级 我会更乐意显示多个分数 但我见过的所有其他线程都太复杂 我无法理解 所以请保持简单
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • 如何连接多个字符串? [复制]

    这个问题在这里已经有答案了 如何将 stringList 中的所有字符串合并为一个而不打印它 例如 s joinStrings very hot day returns string print s Veryhotday 感觉有点倒退 但是
  • 如何在 matplotlib 中第一个 x 轴的底部添加第二个 x 轴?

    我指的是已经提出的问题here https stackoverflow com questions 10514315 how to add a second x axis in matplotlib 在此示例中 用户通过将第二个轴添加到与标
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • Python 包安装:pip 与 yum,还是两者一起安装?

    我刚刚开始管理 Hadoop 集群 我们使用 Bright Cluster Manager 直至操作系统级别 CentOS 7 1 然后使用 Ambari 以及适用于 Hadoop 的 Hortonworks HDP 2 3 我不断收到安装
  • Python 中的颜色处理

    对于我的聚类 GUI 我目前对聚类使用随机颜色 因为我事先不知道最终会得到多少个聚类 在 Python 中 这看起来像 import random def randomColor return random random random ra
  • 如何从 IDLE 命令行运行 Python 脚本?

    在 bash shell 中 我可以使用 bash 或 source 手动调用脚本 我可以在 Python IDLE 的交互式 shell 中做类似的事情吗 我知道我可以转到文件 gt gt 打开模块 然后在单独的窗口中运行它 但这很麻烦
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20

随机推荐

  • 根据id将数组中的n个对象合并到一个数组中

    我正在尝试合并下面列出的对象数组中的 n 个对象 我尝试使用reduce方法 但我不明白我做错了什么 对于高级js方法来说仍然是新的 const array data 1 foo bar test true 4 foo boor data
  • Google 应用程序引擎上的 Python 线程(或其等效项)解决方法?

    我想制作一个执行以下操作的 Google App Engine 应用程序 客户端发起异步http请求 服务器开始处理该请求 客户端发出 ajax http 请求来获取进度 问题是服务器处理 步骤 2 可能需要 30 秒以上 我知道 Goog
  • 如何在 android 中创建自定义渐变?

    我想知道这种渐变颜色在android中是否可行 如果可以的话怎么办 http www techandall com wp content uploads 2013 10 techandall mobile analytics UI conc
  • ASP.NET MVC:在所有操作上执行代码(全局 OnActionExecuting?)

    是否有一个我可以覆盖的 全局 OnActionExecutingall我的 MVC 操作 无论控制器如何 在被调用时会执行某些操作 如果是这样 怎么办 Asp net MVC3 添加了对全局过滤器 http weblogs asp net
  • 如何以编程方式检测操作系统 (Windows) 何时唤醒或进入睡眠状态

    背景 我儿子喜欢在不应该使用笔记本电脑的时候使用他的笔记本电脑 我只是想如果我可以编写一个应用程序 每当他打开 关闭笔记本电脑时就会向我发送电子邮件 这会很方便 我什至愿意接受当机器上有网络流量时通知我的东西 Question 如何以编程方
  • BCrypt 性能恶化

    我们在 Jboss 服务器 6 1 中运行三个 Web 应用程序 标准 Spring MVC Hibernate 所有三个应用程序共享一个通用的身份验证方法 该方法被编译为 JAR 并包含在每个 WAR 文件中 我们的身份验证方法使用 or
  • 格式化字母数字字符串

    我有一个包含 16 个字母数字字符的字符串 例如F4194E7CC775F003 我想将其格式化为 F419 4E7C C775 F003 我尝试使用 string Format 0 F4194E7CC775F003 但这不起作用 因为它不
  • Sublime Text 是否支持 CSS/SASS 文件的实时编辑?

    Sublime Text 支持文件实时编辑吗 我正在寻找更好的工作流程 我真的很喜欢 Sublime Text 但最近我被 Codepen io 和 最近测试的 Adobe Brackets 等工具的 实时编辑 功能宠坏了 当我回到 Sub
  • Boost Python 的性能

    我正在做一个项目 正在尝试使用 boost python 当研究如何组织我的 python 界面时 我遇到了一个问题comment https stackoverflow com questions 4774807 how to organ
  • 立即应用用户界面更改

    我正在 Android 上编写一些 ui 屏幕 有时我需要立即查看 ui 更改 但可以在下一个 ui 线程请求中看到该更改 因此 例如 如果我删除屏幕上的一个视图并以编程方式添加另一个视图 然后更改整个视图 使用 viewAnimator
  • 节点的 xlabels 与点中的边缘重叠

    我尝试使用 dot 绘制图表 但遇到以下问题 节点的标签b与边缘重叠a to b 有没有办法以某种方式移动这个标签来避免这种情况 这是我用来生成图像的代码 使用dot digraph A rankdir LR center true mar
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 用 C++ 读取配置 xml 文件

    如何在C 中读取以下配置文件 STL有支持吗 我无法使用其他第三方库
  • 动画 UIButton Down - Xcode

    我想知道当点击时如何使 UIButton 向下动画 IBAction 提前致谢 在你的里面IBAction UIButton button UIButton sender animates button 25 pixels right an
  • 将寄存器加载到自身的指令的目的是什么?

    在查看 Gameboy 的指令集时 我遇到了如下指令 LD A A LD B B LD C C LD D D 每条指令都有自己的操作码这张桌子 http www pastraiser com cpu gameboy gameboy opco
  • Apollo 客户端错误:无法在上下文中找到“客户端”或作为选项传入。将根组件包装在

    我是新来的阿波罗 我目前正在尝试使用 React 和 Apollo 创建一个应用程序 当我启动我的应用程序时 出现以下错误 在上下文中找不到 客户端 或作为选项传入 将根组件包装在 中 或通过选项传递 ApolloClient 实例 Her
  • 64 位 Windows 的 cygwin 1.7.26 中的 rxvt-native 实用程序在哪里?

    我一直在 cygwin 上使用 rxvt native 程序 我安装了 64 位 cygwin 但在其中找不到 rxvt 包 我安装了相同版本的32位cygwin 看起来它仍然存在 有人知道为什么这个软件包不能用于 64 位 cygwin
  • 如果延迟超过 2147483648 毫秒,setTimeout 会立即触发

    问题 If the delay超过 2147483648 毫秒 24 8551 天 该函数将立即触发 Example setTimeout function console log hey 2147483648 this fires ear
  • Jquery,将标题转换为 Slug

    我有一个执行以下操作的 PHP 脚本 它接受一个字符串 例如 This is a Great Blog Post 1 并返回以下字符串 this is a great blog post 1 我不完全是 Jquery 专家 这就是我问这个问
  • Python-MySQL 中的错误处理

    我正在运行一个基于 python Flask 的小型 Web 服务 我想在其中执行一个小型 MySQL 查询 当我获得 SQL 查询的有效输入时 一切都按预期工作 并且我得到了正确的值 但是 如果该值未存储在数据库中 我会收到一个TypeE