繁体   English   中英

Python - 没有引发异常

[英]Python - Exception not raised

我正在尝试编写一个小脚本来检查作为命令行参数传递的文件是否被括号括起来。

我已经创建了一个异常来处理函数停止点,但似乎无法正常提升它。

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

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

 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 - 读取和写入文件


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM