Python-未引发异常

Python-未引发异常,python,python-3.x,exception,Python,Python 3.x,Exception,我试图编写一个小脚本,检查作为命令行参数传递的文件是否正确地插入了括号 我创建了一个异常来处理函数停止点,但似乎无法正确地提出它 当我在Python解释器中测试代码时,它似乎可以工作(即,如果引发异常,它会识别代码,但当我使用我拥有的示例文件(括号中的示例文件)测试文件时,它仍然会打印出它已成功检查 你有什么想法吗 最好的 代码: import sys from stack import * class BracketException(Exception) : """ Ex

我试图编写一个小脚本,检查作为命令行参数传递的文件是否正确地插入了括号

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

当我在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__()

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

你应该换成

with open(file, "r") as inChannel:
    for line in inChannel :
要确保即使抛出异常也关闭文件,这是首选的文件处理方式,请参阅


我无法对此进行测试(没有堆栈模块-如果需要,我将使用列表),但这应该更快:

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))

您能否显示一个未能生成异常的示例文件?欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时所建议的。在此处应用。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。我们应该你可以将你发布的代码粘贴到一个文本文件中,并重现你描述的问题。谢谢,这真的很有帮助!
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))