Python,如何在捕获异常后使程序继续运行

4

作为一名新手,我对Python和编程都不是很熟悉,我正在努力改进我的一个程序,但是如果遇到异常,我无法弄清楚如何让程序继续运行。也许我看待这个问题的方式有误,举个例子,我的代码类似于下面这样:

    self.thread = threading.Thread(target=self.run)
    self.thread.setDaemon(True)
    self.thread.start()

    def run(self):
        logging.info("Starting Awesome Program") 
        try:
            while 1:
                awesome_program(self)
    except:
        logging.exception('Got exception on main handler')
        OnError(self)

    def OnError(self):
        self.Destroy()

显然,当程序遇到错误时,我目前只是杀死了它。awesome_program基本上使用pyodbc连接并在远程数据库上运行查询。问题出现在连接丢失时。如果我不捕获异常,程序就会冻结,所以我设置了如上所示的方式来终止程序,但如果没有人在场手动重启,这并不总是理想的。是否有一种简单的方法可以使程序保持运行或重新启动。如果我的语法不正确或者编程技能差,请随意指责我。我正在尝试自学,仍然是一个新手,有很多我不理解或可能做得不正确的事情。如果需要,我可以发布更多代码。我不确定要发布多少才不会压倒性。
3个回答

5
在循环内捕获异常,即使捕获到异常也继续执行。
def run(self):
        logging.info("Starting Awesome Program") 
        while 1:
            try:
                awesome_program(self)
            except:
                logging.exception('Got exception on main handler')
                OnError(self)

顺便说一下:

  • 你的缩进看起来很混乱。
  • 我更喜欢使用while True。 Python有bool类型,不像C语言,所以当需要bool值时,请使用while给出一个bool值。

该死,我试图尽快回到这里回答自己的问题,因为我刚刚尝试了你提到的确切方法,我将异常放在了循环中。谢谢!太棒了,我很高兴能得出相同的结论。 - ouldsmobile
有时候,当你卡住了,清晰地陈述问题会帮助你自己找到答案...;-) - Thorsten Kranz
@ Thorsten,这次似乎可以了。复制/粘贴时格式(缩进)出现了问题,我会将循环改为while true:。再次感谢。 - ouldsmobile

3
您在寻找这个:

您正在寻找:

def run(self):
     while True:
         try:
             do_things()
         except Exception as ex:
             logging.info("Caught exception {}".format(ex))

谢谢,就像上面所说的,我没有及时回答自己的问题。只是很高兴我最终得到了相同的结果。 - ouldsmobile

1
请查看Python异常处理,特别是Try...Except。它可以让您捕获特定的错误并根据需要处理它们,甚至完全忽略它们(如果可能的话)。例如:
try:
    while something == True:
        do_stuff()
except ExceptionType:
    print "Something bad happened!" #An error occurred, but the script continues
except:
    print "Something worse happened!"
    raise #a worse error occurred, now we kill it
do_more_stuff()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接