【问题标题】:Ignore exception in Python [duplicate]忽略Python中的异常[重复]
【发布时间】:2012-03-03 20:44:57
【问题描述】:

我在 python 中有 try-except 块,当异常发生时我不想做任何事情。我的代码如下:

for i in range(len(grid)):
    for j in range(len(grid[i])):
        try:
            count = count > int(grid[i][j]) ? count : int(grid[i][j])
        except:
            //Do nothing here

捕获到异常时如何什么都不做。

谢谢。

【问题讨论】:

  • 请不要使用try: .. except: pass - 至少指定一个你想忽略的异常类型!否则,当您没有注意到引发异常时,您可能会在某些时候遇到难以调试的问题。
  • 如果您打算这样做,我强烈建议您指定要忽略的异常(例如IndexError)。默默吞下所有异常是非常糟糕的做法。
  • a ? b : c 构造现在是有效的 Python 吗?!我一定错过了……
  • @ThiefMaster:如何指定异常类型?
  • 要指定异常类型,只需子类化Exception 超类并确保您有一个有用的__str__ 方法

标签: python try-except


【解决方案1】:

pass 是您要查找的关键字。

【讨论】:

  • 理论上你可以在其中添加任何表达式(例如0,但pass更像是pythonic。
  • @NiklasR 我不太确定。 0 是一个表达式,计算结果为 0pass 是一个语句。所以,不完全等价。
  • 但是口译员不会抱怨。 "" 也是可能的,等等。
  • 同样,"" 是一个表达式。解释器可能不会这样“抱怨”,但如果你不打算对结果值做任何事情,我建议不必要地评估它是一种不好的做法,如果没有其他原因会使任何阅读你代码的人感到困惑。
【解决方案2】:

让我们正确地编写代码。

  • 我们想要遍历网格的每个单元格。所以这样做。不要创建您迭代然后用于索引的数字列表 (range)。Python 的 for 循环直接与容器一起使用。它方便易懂,很好。不要抗拒。

  • Python 中没有 ?: 构造。有一个x if y else z 构造,但这在这里不合适。您显然是在尝试将 count 设置为其当前值和单元格值的最大值。有一个内置函数。

  • 您确实想要所有这些单元格中的最大值。所以直接要求;不要假设您必须自己实现高水位线算法。你没有。 (这也可以保护您不必为count 选择一个初始值,这可能是错误的。)我们不需要为此使用显式循环进行迭代。我们可以使用生成器表达式指定要传递给max 的值列表。

  • 您希望“忽略”无法转换为整数的值。尽管如果这些值的存在可能首先发生,那么您的其他代码可能有问题:我们可以简单地进行测试,并过滤掉未通过测试的值。

因此:

def is_integral(value):
    try:
        int(value)
        return True
    except:
        return False


# Now, get the maximum of all the integral values:
count = max(
    int(cell) for row in grid for cell in row
    if is_integral(cell)
)

【讨论】:

  • 这对我来说太高了。这是我的第一天。不过感谢您的建议。
  • 这在概念上没有什么困难(顺便说一句,编程中的“高级”通常意味着与您认为的相反,尽管这很容易理解)。以这种方式编写代码比向您展示如何编写代码更简单。它需要 less 抽象,因为您没有做一些事情,比如试图弄清楚这个 range 对象与您的原始列表有什么关系。尝试教授编程的人通常对什么容易什么难有一些非常奇怪的想法。他们教的东西都乱七八糟。 :(
  • +1 用于解决实际问题。
  • @KarlKnechtel:我会将return True 放在try..except 语句的else 子句中。虽然在这种情况下无关紧要,但它会教初学者正确的方法(仅将可能引发异常的代码放入try,将异常处理放入except,如果一切都去-好的,进入else)
  • @KarlKnechtel:我知道编程语言上下文中的高级意味着什么。在之前的评论中,我指的是初学者的“x for i in a for j in b”的复杂性。你的回答很棒。现在,在多次使用 for 循环之后,您的方法似乎更清洁、更安全、更方便。谢谢。 :)
【解决方案3】:

您可以使用pass,但... 在 Python 3.x 中也是同义词,可以很好地编写伪代码。

我看到很多人使用pass 来真正不需要做任何事情,而使用... 来作为占位符。

class SomeInterface:
    def do_something(self):
        pass

class SomeImplementation(SomeInterface):
    def do_something(self)
        ...

这使得搜索... 并找到未实现代码的区域变得容易,而不会出现pass 的误报。

请注意,传递异常通常是一种不好的做法,因为您几乎总是希望对异常采取行动。您绝对应该至少指定要捕获的确切异常,否则您将捕获所有异常,如果出现不同的异常,可能会导致您无法检测到的错误。

【讨论】:

  • ... 并不是严格意义上的同义词,尽管它没有任何作用。这是一种赤裸裸的表达方式,例如将None0"foo" 放在那里。 ... 评估为 Ellipsis 单例。
  • @ThomasK 没错,同义词对我来说是一个糟糕的选择或词。在这种情况下,它将像 pass 一样工作。
【解决方案4】:
for i in range(len(grid)):
    for j in range(len(grid[i])):
        try:
            count = count > int(grid[i][j]) ? count : int(grid[i][j])
        except:
            pass

【讨论】:

  • 这总是无济于事,因为语句中有一个SyntaxError,并且您正在捕获所有异常。
  • @kindall:我不认为你可以这样捕获 SyntaxError;它应该在声明时提出,而不是在执行期间提出。
【解决方案5】:
result = x if a > b else y

是三元运算符

什么都不做的声明是

pass

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多