函数在单独的实例中运行不同-python

时间:2015-03-15 09:03:42

标签: python function error-handling

我编写了这个程序,它接受一个名为Sonnets的文件,首先,将十四行诗中的所有罗马数字更改为数字,将其复制到新文件,然后要求用户输入数字,并向他们显示与他们相对应的十四行诗数字(如果在1到7之间)。

对于1和7以外的数字,我会显示相应的错误消息,给出他们输入的内容以及他们需要再输入的内容的具体指示。

我分别编写了所有函数,当我将它们放在一起时一切都运行除了函数serve_poem()中的“except”部分。当我单独运行该函数时,它给了我正确的错误消息,但是,现在它只是给我自动错误消息而不是我编码的特定消息。

我在下面发布了我的整个代码,因为我认为其他一个函数中的某些内容正在弄乱它(???)因为它自己运行良好。

def change_romans_to_numbers(s):
    if   s == "I.":     
        return("1.")
    elif s == "II.":    
       return("2.")
    elif s == "III.":   
        return("3.")
    elif s == "IV.":   
        return("4.")
    elif s == "V.":    
        return("5.")
    elif s == "VI.":    
        return("6.")
    elif s == "VII.":   
        return("7.")
    else:               
        return s

def serve_poem():
    sonnet=open(r"C:\Users\Emily\Documents\sonnets.txt", "r")
    x=int(input("Please enter a number 1-7:"))
    s=sonnet.readlines()
    s=list(s)
    try:
        if x==1:
            up=int(2+14*(x-1))
            lower=int(2+14*(x-1)+14)
            for i in range (up,lower):
                print(s[i])
        if 2<=x<=7:
            up=int((2+14*(1-1))+(19*(x-1)))
            lower=int((2+14*(1-1)+14)+(19*(x-1)))
            for i in range (up,lower):
                print(s[i])
        if x<0:
            print("You entered a negative number. Please enter a number between 1 and 7:")
            serve_poem()
        if x==0:
            print("You entered 0. Please enter a number between 1 and 7:")
            serve_poem()
        if x>7:
            print("You entered a number greater than 7. Please enter a number between 1 and 7:")
            serve_poem()
    except ValueError:
        print("Error: Value Error. You did not enter a number at all! Please re-enter a number:")
        serve_poem()

def writing_romans_to_numbers():        
    sonnet=open(r"C:\Users\Emily\Documents\sonnets.txt", "r")
    sonnet_fixed=open(r"C:\Users\Emily\Documents\sonnets-fixed.txt", "w")
    for line in sonnet:
        new=change_romans_to_numbers(line.strip())
        sonnet_fixed.write(new + '\n')

def main():
    writing_romans_to_numbers()
    serve_poem()

main()

这是我的错误消息(如果用户输入q):

File "C:/Users/Emily/.spyder2-py3/temp.py", line 28, in serve_poem
x=int(input("Please enter a number 1-7:"))

ValueError: invalid literal for int() with base 10: 'q'

1 个答案:

答案 0 :(得分:0)

您的问题是您没有将此行包裹在try...except块中:

    x=int(input("Please enter a number 1-7:"))

如果给出非数字输入,此行将引发异常,但try...except块不会处理此异常。你只需要将一行放在try...except块中,如果该行通过它将保证是数字输入,所以你的比较应该有效。

然而,正如Martjin所说,这不是最佳方法。