0

我已经建立了一个最大堆,并且只要有元素就尝试提取最大值。如果没有,我将返回 IndexError。这是我试图执行的代码:

while True:
    try:
        print hp.extract_max()
    except:
        break

在 extract_max() 方法中:

def extract_max(self):
    if self.size == 0:
        return IndexError
    item = self.items[0]
    self.items[0] = self.items[self.size - 1]
    self.heapify_down()
    del self.items[len(self.items) - 1]
    return item

但是,代码在遇到 IndexError 时并没有中断,而是打印它。while循环没有中断。

<type 'exceptions.IndexError'>
<type 'exceptions.IndexError'>
....

它不断打印异常,而不会中断循环。

有什么问题?

4

2 回答 2

5

正如另一个答案所述,您应该这样raise做:exceptionreturn

if self.size == 0:
    raise IndexError

我只想补充一点,您正在使用 捕获所有类型的异常except,您可能希望将其更改为IndexError仅捕获以避免捕获其他异常(例如:)KeyboardInterrupt,如下所示:

while True:
    try:
        print hp.extract_max()

    except IndexError:
        break
于 2017-07-21T14:32:14.560 回答
2

你应该提出一个异常,而不是返回它。做raise IndexError

于 2017-07-21T14:28:31.283 回答