Python - 尝试/除外,什么是好的,什么是错的?

时间:2014-02-15 11:52:58

标签: python try-except

我必须处理大量的尝试/除外。我对正确的做法表示怀疑。

选项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中,我认为是正确的,但代码看起来像是“回调地狱”。

我应该选择哪个选项哪个选项是正确的?

4 个答案:

答案 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负数得到的错误。