2013-03-30 82 views
3

我有我在做数据库操作的功能。在尝试从数据库获取数据之前,我想做一些特殊的事情,我想检查游标对象是否为空,以及连接是否由于超时而丢失。我如何预先检查Python?如何在Python中执行函数之前执行预检查?

我的功能,FOO,酒吧:

Class A: 
    connect = None 
    cursor = None 

    def connect(self) 
     self.connect = MySQLdb.connect (...) 
     self.cursor = self.connect.cursor() 
    def foo (self) : 
     self.cursor.execute("SELECT * FROM car_models"); 
    def bar (self) : 
     self.cursor.execute("SELECT * FROM incomes"); 
+0

在旁注:你如何区分A.connect方法和A.connect属性?我在这段代码中看到了一些含糊不清的地方。 –

回答

1

您可以检查是否光标为null容易:

if cursor is None: 
    ... do something ... 

否则在Python平常的事情是 “请求宽恕不许可” :使用你的数据库连接,如果它超时了,赶上异常并处理它(否则你可能会发现它在你的测试和你使用它的点之间超时)。

+0

我觉得应该有更聪明的方法来做同样的事情,你写了什么。谢谢 – demilg

5

检查操作之前的问题是检查和操作之间可能发生检查的不良情况。

例如,假设你有一个方法is_timed_out()检查,如果连接已经超时:

if not self.cursor.is_timed_out(): 
    self.cursor.execute("SELECT * FROM incomes") 

在它的面前,这看起来像你避免从一个CursorTimedOut异常的可能性执行呼叫。但是可能会调用is_timed_out,返回False,然后光标超时,然后调用execute函数并获取异常。

是的,机会很小,它会在恰当的时刻发生。但在服务器环境中,每天几次会发生百万分之一的机会。不好的东西。

您必须为您的操作做好准备,以免例外而失败。一旦你对这些问题进行了异常处理,你就不需要再进行预检了,因为它们是多余的。

+0

或者Gordon Letwin所说的:“百万分之一是下周二”(http://blogs.msdn.com/b/larryosterman/archive/2004/03/30/104165.aspx) – delnan

相关问题