代码之家  ›  专栏  ›  技术社区  ›  olirwin

Python-未引发异常

  •  1
  • olirwin  · 技术社区  · 6 年前

    我创建了一个异常来处理函数停止点,但似乎无法正确地引发它。

    当我在Python解释器中测试代码时,它似乎可以工作(即它可以识别是否会引发异常,但是当我用我拥有的示例文件(括号错误)测试我的文件时,它仍然打印出它已成功检查

    你有什么想法吗?

    代码:

    import sys
    from stack import *
    
    
    class BracketException(Exception) :
        """
        Exception qui gère les problèmes de parenthesage : mauvaise parenthèse,
        mauvais placement etc...
        """
    
        def __init__(self, char, lineNumber, charNumber) :
            self.char = char
            self.lineNumber = lineNumber
            self.charNumber = charNumber
    
        def __str__(self) :
            return(self.char + " at line " + str(self.lineNumber) + " char " + str(self.charNumber))
    
    
    def checker(file) :
        lineNumber = 1
        charNumber = 1
    
        stacked = Stack()
        openers = ["(", "[", "{"]
        closers = [")", "]", "}"]
    
        inChannel = open(file, "r")
    
        for line in file :
            for char in line :
                if char in openers :
                    stacked.push([char, lineNumber, charNumber])
                    print(stacked.top())
                elif char in closers :
                    try :
                        if openers[closers.index(char)] == stacked.top()[0] :
                            stacked.pop()
                        else :
                            raise BracketException(char, lineNumber, charNumber)
                    except StackEmptyError :
                        raise BracketException(char, lineNumber, charNumber)
    
                charNumber += 1
            charNumber = 1
            lineNumber += 1
    
        inChannel.close()
    
        if not stacked.is_empty() :
            raise BracketException(stacked.top()[i] for i in range(3))
    
    def __main__() :
    
        try :
            fichier = sys.argv[1]
            checker(fichier)
            print("it's checked !")
        except BracketException as ex :
            print(ex)
        except IndexError :
            print("Wrong number of parameters")
        except Exception as e :
            print(e)
    
    if __name__ == "__main__" :
        __main__()
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Patrick Artner    6 年前

    您正在迭代给定的文件名,而不是所创建的文件句柄。文件名中可能没有不平衡的括号,因此也不例外。

    def checker(file) :
        lineNumber = 1
        charNumber = 1
    
        stacked = Stack()
        openers = ["(", "[", "{"]
        closers = [")", "]", "}"]
    
        inChannel = open(file, "r")  # file handle is inChannel
    
        for line in file :  #  iterating over file name, not file handle
    

    你应该换成

    with open(file, "r") as inChannel:
        for line in inChannel :
    

    要确保即使抛出异常也关闭文件,这是首选的文件处理方式,请参阅 docs.python.org - reading and writing files


    def checker(filename) :
        lineNumber = 1
        charNumber = 1
    
        stacked = Stack()
    
        openers = set( "{[(")  # sets are better suited for test of "in"
        closers = set( "}])")  # same
    
        # mapping between closing bracket at hand and what should be on the stack
        # also faster then .index()ing into a list
        open_for_close = { ")":"(","}":"{","]":"[" }
    
        with open(filename, "r") as f:
            for line in f:            # iterate over the filehandle 
                for char in line:
                    if char in openers:
                        stacked.push([char, lineNumber, charNumber])
                        print(stacked.top())
                    elif char in closers:
                        try :
                            if open_for_close[char] == stacked.top()[0] :
                                stacked.pop()
                            else :
                                raise BracketException(char, lineNumber, charNumber)
                        except StackEmptyError :
                            raise BracketException(char, lineNumber, charNumber)
                    charNumber += 1
                charNumber = 1
                lineNumber += 1
    
        if not stacked.is_empty() :
            raise BracketException(stacked.top()[i] for i in range(3))