如何关闭python脚本而不只是激活"除了"在try / except语句中

时间:2016-05-25 22:14:00

标签: python

我有一个python脚本在数据库中运行大约50,000个项目,每个项目大约需要10秒钟,我想停止它。

但是,如果我只是按下ctrl + C,而代码在try除部分之外,那么我的程序输入expect语句并删除该项然后继续。关闭程序的唯一方法是以这种方式重复删除项目,直到我,只是纯粹的运气,不在try语句中捕获它。

如何在不杀死try语句的情况下退出脚本?

编辑1

我的陈述看起来像这样:

for item in items:
   try:
      if is_item_gone(content) == 1:
         data = (item['id'])
         db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
      else:
          do alot of stuff
   except:
      data = (item['id'])
      db.delete('...')

编辑2

我连接到db代码的顶部如下:

#!/usr/bin/python
import MySQLdb
import sys

class Database:
....

3 个答案:

答案 0 :(得分:2)

问题是因为你使用了一个除了之外的,这总是一个坏主意,如果你捕获了特定的例外,那么当你的脚本将KeyboardInterrupt停止时:

for item in items:
   try:
      if is_item_gone(content) == 1:
         data = (item['id'])
         db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
      else:
          do alot of stuff
   except MySQLdb.Error  as e:
      print(e)
      data = (item['id'])
      db.delete('...')

如果您还有其他例外情况,可以在except:

中使用multiple
 except (KeyError, MySQLdb.Error) as e

至少你可以抓住Exception as e并打印错误。

for item in items:
   try:
      if is_item_gone(content) == 1:
         data = (item['id'])
         db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data)
      else:
          do alot of stuff
   except Exception as e:  
      print(e)
      data = (item['id'])
      db.delete('...')

故事的寓意是不要使用毯子,除了抓住你所期望的并记录错误也可能是一个好主意。 exception-hierarchy也值得一读,看看你到底抓到了什么。

答案 1 :(得分:1)

我会像这样重写它:

try:
    # ...
except Exception:  # I would use an even more specific exception here if you can.
    data = (item['id'])
    db.delete('...')

或者只是

def _main(args):
   ...

if __name__ == '__main__':
    try:
        sys.exit(_main(sys.argv[1:]))
    except KeyboardInterrupt:
        print >> sys.stderr, '%s: interrupted' % _SCRIPT_NAME
        sys.exit(1)

Python 2的例外情况可以在这里找到:https://docs.python.org/2/library/exceptions.html#exception-hierarchy

此外,许多脚本都是用底部的锅炉板写的:

except:

当您在主体中使用except Exception:而不是KeyboardInterrupt时,您不允许此顶级异常块捕获KeyboardInterrupt。 (你不 实际抓住它让Ctrl-C工作 - 这只会在{{1}}被引发时变得更漂亮。)

答案 2 :(得分:0)

<!--[if (!IE 8)|(!IE 9)]><!-->
  <p>Not IE8, or IE9. Multiple Upload</p>
<!--<![endif]-->

<!--[if (IE 8)|(IE 9)]>
  <p>IE8, or IE9. Single Upload</p>
<![endif]-->

这将在任何给定时间注册并捕获例如 Ctrl + c 。处理程序将相应地终止套接字,然后退出,退出代码为0,这是一个很好的退出代码。

这是捕捉键盘中断的更“全局”的方法。