【问题标题】:What is the most efficient manner to handle errors in python?在python中处理错误的最有效方法是什么?
【发布时间】:2023-03-23 23:35:01
【问题描述】:

我是 python 的新手,我正在尝试处理错误,但我不知道在 python 中处理错误的最有效方法。我尝试过这种方式,但理解起来似乎有点复杂。我认为可能存在其他一些“更好”的方式来处理它。

def set_bit(value, pos, nbits):
"""
Set bit at position.

Keyword Arguments
    value (int)
        Bitstring value.
    pos (int)
        Position to set bit.
    nbits (int)
        Number of bits.
"""
if isinstance(value, int):
    if value > -1:
        # Positives only
        if isinstance(pos, int):
            if pos > -1:
                if isinstance(nbits, int):
                    if nbits > -1:
                        return get_bistring(value | 2 ** (pos % nbits), nbits)
                    else:
                        raise ValueError(
                            '"nbits" was set {}, but it must be positive only'
                            .format(nbits)
                        )
                else:
                    raise TypeError(
                        '"nbits" was set {}, but it must be int only'
                        .format(type(nbits))
                    )
            else:
                raise ValueError(
                    '"pos" was set {}, but it must be positive only'
                    .format(pos)
                )
        else:
            raise TypeError(
                '"pos" was set {}, but it must be int only'
                .format(type(pos))
            )
    else:
        raise ValueError(
            '"value" was set {}, but it must be positive only'
            .format(value)
        )
else:
    raise TypeError(
        '"value" was set {}, but it must be int only'
        .format(type(value))
    )

【问题讨论】:

  • 而不是if else 使用try except

标签: python error-handling try-catch assertion isinstance


【解决方案1】:

你可以试试这样写

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

【讨论】:

    【解决方案2】:

    反转逻辑以简化代码:

    def set_bit(value, pos, nbits):
        """
        Set bit at position.
    
        Keyword Arguments
            value (int)
                Bitstring value.
            pos (int)
                Position to set bit.
            nbits (int)
                Number of bits.
        """
        if not isinstance(value, int):
            raise TypeError('"value" was set {}, but it must be int only'.format(type(value)))
        if value < 0:
            raise ValueError('"value" was set {}, but it must be positive only'.format(value))
        if not isinstance(pos, int):
            raise TypeError('"pos" was set {}, but it must be int only'.format(type(pos)))
        # and so on...
    
        # once you finish all your checks, then do what you planned to do
    

    由于raise 将自动取消函数其余部分的执行,任何出现在条件 raise 之后的代码都可以假定条件不适用,因此您不需要 else 语句。

    【讨论】:

    • 但是在处理错误时,try-catch 语句不是更有说服力吗?似乎 if-else 语句不是这个的“最佳”选项。
    • @ÁtilaDiasdaGamaeSilva 尽管标题中有“处理”一词,但所写的问题是关于引发异常,而不是捕获它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多