我必须处理大量的尝试/除外。我对正确的做法表示怀疑。
选项1:
inst = Some(param1, param2)
try:
is_valid = retry_func(partial(inst.some_other), max_retry=1)
except RetryException, e:
SendMail.is_valid_problem(e)
if is_valid:
print "continue to write your code"
...
*** more code with try/except ***
...
选项2:
inst = Some(param1, param2)
try:
is_valid = retry_func(partial(inst.some_other), max_retry=1)
if is_valid:
print "continue to write your code"
...
*** more code with try/except ***
...
except RetryException, e:
SendMail.is_valid_problem(e)
在选项1中,即使引发了异常,也会测试“is_valid”,我不需要它。
在选项2中,我认为是正确的,但代码看起来像是“回调地狱”。
我应该选择哪个选项或哪个选项是正确的?
答案 0 :(得分:7)
使您的异常处理尽可能接近引发异常的代码。您不希望意外地掩盖您认为不会引发相同异常的代码中的其他问题。
这里有第三个选项,使用else:
语句的try
套件:
inst = Some(param1, param2)
try:
is_valid = retry_func(partial(inst.some_other), max_retry=1)
except RetryException, e:
SendMail.is_valid_problem(e)
else:
if is_valid:
print "continue to write your code"
...
*** more code with try/except ***
...
只有在else:
套件中没有引发异常时才会执行try
套件。
答案 1 :(得分:1)
我认为选项1更好。原因是你应该总是把它放在一个try中,除了你期望抛出异常的代码。增加代码会增加捕获不需要的异常的风险。
答案 2 :(得分:1)
根据您的条件,条件1更好,您可以使用其他代替if is_valid
以下是一些Try Except:
以下是try ....的简单语法,除了... else blocks:
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
有多个例外的except子句:
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
try-finally子句:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
答案 3 :(得分:0)
确保如果发生错误,请将原因保留在try语句中。这样,它将捕获错误并在except部分中对其进行排序。最后还有。如果try不起作用,但“except”错误不起作用,它将表示“finally”语句。如果没有最终,程序将被卡住。这是一个示例代码,包含try和except: 导入系统 导入数学 而真: X = sys.stdin.readline() X =浮子(x)的 尝试: X = math.sqrt(x)的 Y = INT(x)的 如果x!= y: 打印(“您的号码不是方形号码。”) elif x == y: 打印(“您的号码是一个正方形号码。”) 除了(ValueError异常): 打印(“你的号码是否定的。”) ValueError是从sqrt-an负数得到的错误。