在python中处理错误最有效的方式是什么?

在python中处理错误最有效的方式是什么?,python,error-handling,try-catch,assertion,isinstance,Python,Error Handling,Try Catch,Assertion,Isinstance,我是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

我是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))
    )

你可以试着这样写

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

你可以试着这样写

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

颠倒逻辑以简化代码:

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语句。

颠倒逻辑以简化代码:

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语句。

而不是if-else-go-with-try-exception而不是if-else-go-with-try-exception-but-not-try-catch语句在处理错误时更加复杂?似乎if else语句不是最好的选择。@Átiladisdagamasesilva尽管标题中有“handle”一词,但所写的问题是关于引发异常,而不是捕获异常。但在处理错误时,catch语句是否更具普适性?似乎如果else语句不是最好的选择。@tilaDiasdaGamaeSilva尽管标题中有“handle”一词,但所写的问题是关于引发异常,而不是捕捉异常。