-1

这是我的项目(我无法完全分享)的一个功能,用于不断失败的工作。我们正在使用 Raspberry Pi 开发用于数据采集和电机控制的多用途系统。我建立了一个大型的 try:/except: 系统来进行调试以及如果我们的用户以某种方式提供错误数据。

该函数通过提供的数据成功迭代,设置0b00b1为每个提供给它的文本“0”或“1”。但是,一旦它成功转换为“真正的”二进制文件,它会在迭代八个一组以转换它们时失败(这是因为,由于某种原因,其他尝试int(x, base)抛出了TypeError)。抛出的错误不是以下任何一种:

  1. 类型错误
  2. 算术错误
  3. RuntimeError (它应该回退到,对吗?)
  4. 环境错误
  5. UnboundLocalError
  6. 查找错误
  7. 值错误
  8. 索引错误

运行for i in range(0, floor(length / 8), 1):and 子代码也会引发错误,但没有描述 - 它只是失败了。这几天我一直在调试这个奇异的功能,这似乎是最后一个问题,但我真的不知道它为什么会失败。函数 ,convertStates(data)如下。

def convertStates(data):
    # Converts binary states (0/1) in any format (due to built-in functions not working) to text.
    n = 0
    dmn = str(data)
    dat = '0b0'
    datFirst = True
    try:
        for i in dmn:
            toapp = '0b0' if (i == 0) else '0b1'
            if (datFirst):
                dat = toapp
                datFirst = False
            else:
                dat.join(toapp)
    except:
        print("Error: Failed to append binary values to list.")
        exit()
    try:
        length = len(dat)
    except:
        print("Error acquiring length of binary data")
        exit()
    try:
        for i in (range(0, floor(length / 8), 1)):   <<<< SOMETHING HERE
            try:
                temp = int(dat[i*8:i*8+8],2) # this is perfectly fine
            except:
                print("Error with byte storage")
            try:
                a = temp.decode("utf-8")
                print(str(a))
            except:
                print("Error with decoder")
            try:
                n += chr(a)
            except:
                print("Error with character converter")
    except ValueError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to value mismatch.")
        exit()
    except TypeError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to value type mismatch.")
        exit()
    except UnboundLocalError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to unbound variable(s).")
        exit()
    except IndexError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to an index call for nonexistent value.")
        exit()
    except ArithmeticError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to math error.")
        exit()
    except LookupError:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary->string due to lookup error.")
        exit()
    except:
        print("Exception occurred in 'convertStates(data)' function!")
        print("Error: Could not convert binary bytewise to string.")
        exit()
    return n

正如我之前所说,try:/except: 系统已经到位,以识别我的错误,并为最终用户解决问题奠定基础。

我已经查看了十多个不同的帖子,但无济于事。我找不到这个错误,我不得不以这种方式设置它,因为int(x, base)无法转换任何东西- 请参阅此处的这篇文章(在 python 中将字符串转换为二进制),这是我尝试使用的一种解决方案。

至于exit()调用,这样我们就不会得到二十个异常堆积在一起的无限循环,因为这个函数是在循环的一部分中调用的。

我做错了什么,我该如何解决?是我应该注意到的一些愚蠢的小事(Python 不是我的首选语言),还是完全是别的东西?任何帮助表示赞赏。这只是让我有点发疯 - 我看过的任何东西都无法解决它或导致我这样做的问题。

编辑:人们已经说过要在没有裸露的情况下放置回调except:,正如我之前所说,它什么也没提供。它只是失败了。没有错误代码,没有回溯,什么都没有。我在这里说实话 -except:从测试代码和循环中删除了。它所做的只是退出,它应该继续运行。

4

1 回答 1

1

这些都没有意义。任何一个:

  1. 您是用户,您需要了解如何阅读回溯
  2. 您代表您的用户承担了太多的无能

捕获个别异常,吞噬回溯,然后退出程序是没有意义的。什么都没有解决(您的异常处理不允许程序继续),现在用户只是得到一个打印输出,告诉他们没有什么特别的。实际上,它适得其反。你只是让任何人都更难调试。

这很容易说明:

def to_int(something):
    return int(something)

a = 2
b = '3.4'

lst = [a, b]

for item in lst:
    to_int(item)

给出:

Traceback (most recent call last):

  File "D:\github\beatroute_test\untitled1.py", line 10, in <module>
    to_int(item)

  File "D:\github\beatroute_test\untitled1.py", line 2, in to_int
    return int(something)

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

相对:

def to_int(something):
    return int(something)

a = 2
b = '3.4'

lst = [a, b]

for item in lst:
    try:
        to_int(item)
    except ValueError:
        print("There's a ValueError!")

在第二种情况下,我不知道是哪个值导致了它。

于 2020-06-25T17:55:32.427 回答