2012-04-15 75 views
18

我有这样的try /除外代码:如何在try/exit中退出程序?

document = raw_input ('Your document name is ') 

try: 
    with open(document, 'r') as a: 
     for element in a: 
      print element 

except: 
    print document, 'does not exist' 

如何退出程序,我打印后“[文件名]不存在”? breakpass显然不起作用,我不想有任何崩溃错误,所以sys.exit不是一个选项。

请忽略try部分 - 它只是一个假人。

回答

6

使用

sys.exit(1) 

是不是一个错误崩溃,这是退出的程序完全正常的方式。 1的退出代码是一个约定,意味着出现了问题(如果运行成功,您将返回0)。

+0

出于好奇,使用'quit()'有什么问题吗?似乎没有人提到那一个。 – 2012-04-15 22:54:22

+2

'quit()'仅用于在交互式Python shell中工作。我不会在程序中使用它。它没有在http://docs.python.org/library/functions.html上列出,我不希望它可以移植到其他Python实现中。 – 2012-04-15 23:07:18

23

使用sys.exit:

import sys 

try: 
    # do something 
except Exception, e: 
    print >> sys.stderr, "does not exist" 
    print >> sys.stderr, "Exception: %s" % str(e) 
    sys.exit(1) 

一个好的做法是打印发生,所以你可以事后调试例外。

您还可以使用traceback模块打印堆栈跟踪。

请注意,您在sys.exit中返回的int将是您的程序的返回码。要查看你的程序返回什么退出代码(这将给你会发生什么,并且可以自动信息),你可以这样做:

echo $? 
7

你也可以把你的代码的功能,并发出返回。您可以称它为主,您可以从脚本中调用它。

def main(): 
    document = raw_input ('Your document name is ') 

    try: 
     with open(document, 'r') as a: 
      for element in a: 
       print element 

    except: 
     print document, 'does not exist' 
     return 

if __name__ == "__main__": 
    main() 
+0

如果出现异常,“返回”的问题是您不会在命令行中看到任何错误代码。如果您有监控系统,他们通常会检查日志以及程序的返回代码,因此如果程序在所有情况下都返回0,即使出现错误,维护也会非常棘手。 – 2012-04-15 22:32:14

+0

@linker您仍然可以在返回之前打印错误消息。并不是所有的程序都需要为其他程序生成输出 - 有时候,仅仅是人类可读的程序就足够了。 – agf 2012-04-15 22:34:11

+2

@agf我只是解释了我在现实世界中发现的最有用的东西,最好的方法是同时具有可读的和一致的返回码约定。 – 2012-04-15 22:38:05

5

只是重新提高它。这对开发者

document = raw_input ('Your document name is ') 

try: 
    with open(document, 'r') as a: 
     for element in a: 
      print element 

except: 
    print document, 'does not exist' 
    raise 

检查python documentexcept约再次加注错误引发异常部分更友好。