如何抑制python中的错误消息?

时间:2019-03-16 22:02:32

标签: python error-handling iterator

因此,我正在尝试制作一个程序,以删除给定字符串中所有重复的字母。该代码基本上是一个自制的迭代器,我从另一篇文章中获得:How do I reset a list iterator in Python?

string = "NNEEXXxxTTGGEENNCCOODDEERR"

class rmvDuplicates:

def __init__(self, list, newString):
    self.newString = newString
    self.list = list
    self.idx = 0
    self.content = list[self.idx]

def __iter__(self):
    return self

def get_content(self, content):
    return content

def get_index(self):
    return self.idx

def get_content_next(self, content):
    try:
        self.idx += 1
        return self.content
    finally:
        self.idx -= 1

def remove(self, elem):
    del self.list[self.idx]
    return

def rewind(self):
    self.idx = 0

def __next__(self):
    try:
        return self.list[self.idx]
    except IndexError:
        pass
    finally:
        self.idx += 1
        self.content = self.list[self.idx]  

new_String = []

li = rmvDuplicates(list(string), new_String)

for elem in li:
    if li.get_content(elem) == li.get_content_next(elem):
        print(li.get_content(elem))
        li.remove(elem)
        print(li.list)

print("Hello")

注意:print("Hello")仅用于测试目的

我对其进行了一些修改以满足我的需要,并且效果很好,直到达到IndexError为止。

def __next__(self):
    try:
        return self.list[self.idx]
    except IndexError:
        pass
    finally:
        self.idx += 1
        self.content = self.list[self.idx]

我已经尝试使用带有pass方法的Except-Block来解决这个问题。

但是,程序仍然显示此消息:

Traceback (most recent call last):
  File "rmv_dplc_cls.py", line 49, in <module>
    for elem in li:
  File "rmv_dplc_cls.py", line 42, in __next__
    self.content = self.list[self.idx]
IndexError: list index out of range

这里有没有人知道如何解决此问题,因此程序可以继续运行并且不会中止。

谢谢

2 个答案:

答案 0 :(得分:1)

感谢@jfaccioni。您的建议非常有帮助。这对我来说并不太好,所以我做了如下修改:

def __next__(self):
    try:
        value = self.list[self.idx]
        self.idx += 1
        self.content = self.list[self.idx]
    except IndexError:
        value = self.list[self.idx]
    finally:
        if self.idx == len(self.list):
            raise StopIteration
        return value

我需要self.content才能正常工作。

感谢您的帮助。

答案 1 :(得分:0)

尝试将您的__next__方法更改为:

def __next__(self): 
    try: 
        value = self.list[self.idx]
        self.idx += 1
    except IndexError:
        self.idx = 0
        value = self.list[self.idx]
    finally:
        return value

说明:

如果try子句失败,则意味着self.list[self.idx]访问列表范围之外的元素,从而引起IndexError升高。在这种情况下,尝试访问相同的self.list[self.idx]将导致这次在try子句之外的另一个IndexError