什么是最有效的方式来处理Python中的错误?
问题描述:
我是Python新手,我试图处理错误,但我不知道最有效的方式来处理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
答
倒置的逻辑来简化代码:
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
将自动取消该功能的其余部分的执行,在有条件加注之后出现的任何代码都可以假定条件不适用,因此您不需要else
语句。
+0
但是在处理erros时没有try-catch语句更具说服力吗?似乎if-else语句不是这个的“最佳”选项。 –
+0
@ÁtilaDiasdaGamaeSilva尽管标题中使用了“句柄”这个词,但书写的问题是关于引发异常,而不是捕捉它们。 – Amber
而不是'if else'用'try''去除' – 0TTT0