python - 尝试将二进制转换为十进制: ended with a weird int error?

标签 python python-3.x error-handling

我正在写一个将二进制转换成十进制的python代码。

def bin_dec (binary):
    binary_list = list(str(binary))
    **for bit in binary_list:
        if int(bit) > 1 or int(bit) < 0:
            print('Invalid Binary')
            print('')
            exit()**    
    total = 0
    argument = 0
    binary_length = len(str(binary))
    exponent = binary_length - 1
    while exponent >= 0:
        total += (int(binary_list[argument]) * (2**exponent))
        argument += 1
        exponent -= 1
    print(total)
    print('')

当我用负数二进制代码测试代码时,我看不到输出“Invalid Binary”
相反,我看到一个整数错误
>>> bin_dec(-10)
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    bin_dec(-10)
  File "E:/Bronx Science/Sophomore/Computer Science_Python/Edwin Chen_Lab 8_Diamond and Squares.py", **line 27, in bin_dec
    if int(bit) > 1 or int(bit) < 0:**
ValueError: invalid literal for int() with base 10: '-'

最佳答案

您说ValueError时会立即引发int(bit),因为bit'-'。您永远不会到达代码的下一行,因为未捕获到异常,因此它引发了脚本的全部故障。

代替:

for bit in binary_list:
    if int(bit) > 1 or int(bit) < 0:
        print('Invalid Binary')
        exit()

您可以执行以下操作:
for bit in binary_list:
    try:
        assert 0 <= int(bit) <= 1
    except AssertionError, ValueError:
        print('Invalid Binary')
        exit()

注意,在函数中调用exit()通常被认为是不好的做法。如果仅允许引发异常,则无论如何都会导致脚本退出,因此您可以执行以下操作:
for bit in binary_list:
    assert 0 <= int(bit) <= 1, 'Invalid Binary'

或许:
assert all(bit in {'0', '1'} for bit in binary_list), 'Invalid Binary'

并获得基本相同的效果(加上一个堆栈跟踪,它将告诉用户确切杀死了脚本的内容)。这种方法的区别在于,如果函数的调用者确定他们想要做其他事情(例如,尝试提示用户输入另一个数字),则可以选择使用catch记录异常;如果您只是exit(),则他们没有机会修复该错误。

关于python - 尝试将二进制转换为十进制: ended with a weird int error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61256730/

相关文章:

javascript - 在 Python 中,您可以像在 JavaScript 中那样对字符串函数进行原型(prototype)设计吗?

python - 什么是实现 __hash__() 的正确和好方法?

error-handling - 抛出解包 nil optional

perl - 使用 Log::Log4perl 记录所有意外错误

python - 在 OpenCV2 中找到最接近图像中心的轮廓

python - 创建word文档,然后将其附加到电子邮件Django

python-3.x - Python sys.stdout.flush() 不起作用

python - 如果字符串与列表中的字符串匹配,如何从句子中删除字符串

python-3.x - tf.gradients() 是如何工作的?

python - 在Python中捕获403禁止访问