当发生“异常”时,防止用Python关闭命令Prompt

时间:2013-04-05 15:37:01

标签: python exception-handling coding-style

我在Python 2.7中使用py2exe在可执行文件中转换了一个脚本。 INPUT数据是一个文本文件,其中分隔符必须在此函数后有效:

# Check if delimeter is valid
def get_parse(filename, delimiters=['\t', ',', ' ', ':', ';', '-']):
    with open(filename) as f:
        f.next()
        secondline = f.next()
    for delimiter in delimiters:
        if len(secondline.rstrip().split(delimiter)) >= 3:
            return delimiter
    raise Exception("couldn't find a delimiter that worked!")

当分隔符无效时(例如:点)我正在以Python优雅的方式寻找两个解决方案:

  • 在没有加载正确的INPUT数据之前,您无法传递给OUTFILE

  • 脚本打破代码,显示错误,但窗口(何时是 * .exe)在没有解释的情况下不立即离开用户

INPUT = raw_input("Input (*.txt): ")
while not os.path.exists(INPUT):
      print IOError("No such file or directory: %s" % INPUT)
      INPUT = raw_input("Input (*.txt): ")
try:
    parse = get_parse(INPUT)
except Exception:
    print ValueError("Delimiter type not valid")
    break
OUTPUT = raw_input("Output (*.txt): ")

使用此解决方案(中断)我的* .exe文件的窗口关闭,让用户无需解释

2 个答案:

答案 0 :(得分:1)

您可以使用sys.excepthook为未捕获的异常挂钩异常处理程序,并根据raw_input()将其调用input()(或3.x中的this answer)。

快速举例:

import sys
def wait_on_uncaught_exception(type, value, traceback):
    print 'My Error Information'
    print 'Type:', type
    print 'Value:', value
    print 'Traceback:', traceback
    raw_input("Press any key to exit...")
sys.excepthook=wait_on_uncaught_exception

只需修改它以获得任何输出或任何你想要的东西(我建议查看traceback模块)。

但是,如果您希望它更具体地针对您的代码,那么只需将raw_input("Press any key to exit...")放入您已有的解决方案中,它应该没问题。以上应该提供更一般的解决方案。

答案 1 :(得分:1)

您并没有真正搜索分隔符,只是字符串中的字符。你应该真的使用CSV模块。

from __future__ import print_function

delimiters=['\t', ',', ' ', ':', ';', '-']

def getfile():
    fname =""
    while fname is "":
            fname = str.lower(raw_input("Input(*.txt): "))
            while fname.endswith(".txt") is not True:
                    print ("File must be .txt")
                    fname = str.lower(raw_input("Input(*.txt): "))
            if fname.endswith(".txt"):
                try:
                    with open(fname,'rb') as f:
                        parsed = False
                        while not parsed:
                            data = f.readline()
                            for d in delimiters:
                                if d in data:
                                    print ("Delimiter: {0} found".format(d))
                                    parsed = True
                                    # do your additional stuff here
                                else:
                                    print ("Unable to find delimiter {0}".format(d))
                                    parsed = True
                except IOError as e:
                    print( "Error: ", e)

getfile()