3

我有一段不在函数中的代码,比如说

x = 5
y = 10
if x > 5:
    print("stopping")

我可以在 print 语句之后放置什么来阻止代码进一步运行?Sys.exit() 有效,但会引发我不希望在程序中出现的错误。我希望它安静地停止代码,就好像它已经到达主循环的末尾一样。谢谢。

4

5 回答 5

12

正如 JBernardo 指出的那样,sys.exit()引发了一个异常。这个例外是SystemExit。当它不被用户代码处理时,解释器干净地退出(调试程序的调试器可以捕获它并保持对程序的控制,例如,由于这种机制)——而不是os._exit(),它是无条件中止程序。

此异常不会被 捕获except Exception:,因为SystemExit它不继承自Exception。但是,它被一个裸子句抓住了。except:

因此,如果您的程序发现异常,您可能希望通过使用except Exception:而不是捕获更少的异常except:。也就是说,不鼓励捕获所有异常,因为这可能会隐藏真正的问题,所以如果可以的话,通过使except子句(如果有的话)更具体来避免它。

我对这种SystemExit异常机制为何有用的理解是,用户代码在一个子句中找到之后会遍历任何子句:文件finally可以干净地关闭,等等;然后解释器捕获用户未捕获的任何内容并永久退出(调试器将改为捕获它以保持解释器运行并获取有关退出程序的信息)。sys.exit()exceptSystemExit

于 2013-04-28T03:09:09.767 回答
5

你可以通过这样做来做你正在寻找的东西:

import os
os._exit(1)
于 2013-04-28T02:39:32.853 回答
2

sys.exit()这相当于sys.exit(0)意味着成功退出。sys.exit(1)sys.exit("Some message")表示失败退出。这两种情况都会引发SystemExit异常。事实上,当你的程序正常存在时,它就像sys.exit(0)被调用一样。

于 2013-04-28T03:22:45.163 回答
0

当我遇到这个线程时,我正在寻找一种方法来退出程序而不会出现错误,没有例外,让代码显示为“PASSED”,然后继续运行其他测试文件。对我来说,解决方案是使用return语句。

.
.
.
    if re.match("^[\s\S]*gdm-simple-slave[\s\S]*$", driver.find_element_by_css_selector("BODY").text) == None:
        print "Identifiers object gdm-simple-slave not listed in table"
        return
    else:
        driver.find_element_by_xpath("//input[@value='gdm-simple-slave']").click()
.
.
.

这让我可以在保持调试器运行的同时运行多个程序......

test_logsIdentifiersApache2EventWindow.py@16::test_LogsIdentifiersApache2EventWi
窗口**通过**
test_logsIdentifiersAudispdEventWindow.py@16::test_LogsIdentifiersAudispdEventWi
窗口**通过**
test_logsIdentifiersGdmSimpleSlaveEventWindow.py@16::test_LogsIdentifiersGdmSimp
leSlaveEventWindow 标识符对象 gdm-simple-slave 未在表中列出
**通过**
test_logsIdentifiersAuditdEventWindow.py@16::test_LogsIdentifiersAuditdEventWind
现在**通过**
于 2014-12-31T20:22:53.593 回答
-1

使用try-except 语句

a = [1, 2, 3, 4, 5] 
for x in xrange(0,5):
    try:
        print a[x+1] #this is a faulty statement for test purposes
    except:
        exit()

print "This is the end of the program."

输出:

> python test.py
2
3
4
5

尽管出现了错误,但没有打印错误。

于 2013-04-28T02:45:53.650 回答