【问题标题】:Error trapping combined with a counter not working错误捕获结合计数器不起作用
【发布时间】:2019-12-29 17:24:48
【问题描述】:

我正在编写一个让用户逐行输入 RLE 的代码。然后我将输入的数据发送到解码它的函数。在函数中,我包含了一些基本的错误捕获。

我的错误是,当用户只能输入错误的数据时,他们选择的次数(他们选择了他们想要输入的行数)。即,如果用户输入了 2 行(共 3 行)正确的 RLE 行,然后输入了不正确的行,则代码不会要求再次输入 RLE,但如果他们在第一次或第二次输入时输入了错误的行,它会起作用。

代码:

if line_amount>2:
            print ("Please enter the compressed data one line at a time")
            while line_amount > counter:
                compressed_data = input('->') #ENTER RLE DATA
                counter+=1
                RLEtoASCII(compressed_data,counter)

RLEtoASCII:

def RLEtoASCII(compressed_data,counter):
    try:
        pairs = [(int(compressed_data[i:i+2]), compressed_data[i+2]) for i in range(0, len(compressed_data), 3)]
        global text
        text = ''.join(n * c for n, c in pairs)
        RLE_Inputs = open("Entered Data.txt", 'a+') #File that lists all the inputs
        #[etc all the file writing]
    except:
        print('THERE WAS A PROBLEM WITH THE VALUES Please re-enter values.\n')

如果我尝试在例外之后调用RLEtoASCII,它会创建一个循环。 counter -=1 似乎在除了...

【问题讨论】:

    标签: python loops error-handling try-except


    【解决方案1】:

    通过将错误处理从您的函数中移到 if 循环中,我们可以更轻松地控制迭代:

    if line_amount>2:
                print ("Please enter the compressed data one line at a time")
                while line_amount > counter:
                    compressed_data = input('->') #ENTER RLE DATA
                    if compressed_data != '':
                        try:
                            RLEtoASCII(compressed_data)
                            counter+=1
                        except:
                            print('THERE WAS A PROBLEM WITH THE VALUES Please re-enter values.\n')
    

    RLEtoASCII:

    def RLEtoASCII(compressed_data):
        pairs = [(int(compressed_data[i:i+2]), compressed_data[i+2]) for i in range(0, len(compressed_data), 3)]
        global text
        text = ''.join(n * c for n, c in pairs)
        RLE_Inputs = open("Entered Data.txt", 'a+') #File that lists all the inputs
        #[etc all the file writing]
    

    【讨论】:

    • 谢谢。这解决了问题!非常感谢! (对不起我的无知lol...)
    • 别担心!没关系,你不是无知,我们都会犯错。
    【解决方案2】:

    尝试将while line_amount > counter: 中的> 更改为>=。这是因为当您到达第三行时,它正在测试 if 3>3 是否为假,而 3>=3 是否为真。

    【讨论】:

    • 这只会消除错误。然后,如果在输入#2 输入错误,您将有两次机会,但仅此而已,它不会一遍又一遍地询问您,直到您获得三个正确的输入。
    【解决方案3】:

    问题似乎是counter 即使在您发现错误时也会增加。我将计数器更改为全局,以便在出现错误时它不会有效地增加。只需确保将global counter 置于定义之上。让我知道这是否适合您。

    if line_amount>2:
                print ("Please enter the compressed data one line at a time")
                while line_amount > counter:
                    compressed_data = input('->') #ENTER RLE DATA
                    counter+=1
                    RLEtoASCII(compressed_data)
    

    RLEtoASCII:

    def RLEtoASCII(compressed_data):
        global counter
        try:
            pairs = [(int(compressed_data[i:i+2]), compressed_data[i+2]) for i in range(0, len(compressed_data), 3)]
            global text
            text = ''.join(n * c for n, c in pairs)
            RLE_Inputs = open("Entered Data.txt", 'a+') #File that lists all the inputs
            #[etc all the file writing]
        except:
            print('THERE WAS A PROBLEM WITH THE VALUES Please re-enter values.\n')
            counter-=1
    

    【讨论】:

    • def option_1(counter): 会影响它吗?因为它似乎因为代码不起作用......(我不是全球和本地人最好的)
    • 我不太清楚你的意思。全局变量是可以在所有函数中使用的变量,这就是为什么当您尝试 counter -=1 时,如您的问题中所述,它不起作用。局部变量是不能在定义它的函数之外调用的变量。这里的一个例子是变量pairs
    • 这实际上不是一个很好的解决方案,我将发布另一个效果更好且不需要全局的答案。
    猜你喜欢
    • 2021-10-06
    • 2019-03-02
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多