如何在python中记录缩进错误?

时间:2018-12-17 04:51:57

标签: python python-2.7 debugging error-handling try-except

嗨,我正在尝试在函数test()中记录缩进错误,但是当我运行代码时,它正在执行而没有任何错误。任何人都可以在这里告诉我原因。

data BinChar : Char -> Type where
  O : BinChar '0'
  1 : BinChar '1'

data Every : (a -> Type) -> List a -> Type where
  Nil : {P : a -> Type} -> Every P []
  (::) : {P : a -> Type} -> P x 
                         -> Every P xs
                         -> Every P (x :: xs)

fromBinChars : Every BinChar xs -> Nat -> Nat
fromBinChars [] k = k
fromBinChars (O :: z) k = fromBinChars xs (k - 1)
fromBinChars (I :: z) k = pow 2 k + fromBinChars xs (k - 1)  

3 个答案:

答案 0 :(得分:1)

Python会先解析整个代码文件,然后再开始执行任何代码。不幸的是IndentationErrorSyntaxError的子类,这是一个错误,只能从evalexecimport语句中捕获。

出于测试目的,您可以将一些损坏的代码编写到一个单独的文件中,然后尝试将该文件作为模块导入。这样,您就可以捕获IndentationError(如果与您相关)。

答案 1 :(得分:0)

考虑将Python理解为各个级别的代码,其中缩进定义每个代码属于哪个级别。

因此,可以像从通常从2级转到3级那样,从2级(尝试声明-第2行)转到4级(3行)。

但是,如果您尝试从级别2转到级别1,而没有按照其定义的语法编译try语句,则会收到错误消息。

也许不要像上面那样捕获缩进错误,而是尝试定义一个检查级别的函数,而不是Python编译器抛出的错误。

只需澄清一下,这是您的代码,上面印有级别和行号:

1    def test():                                           //Level 1
2            try:                                          //Level 2
3                            print "ABC" //indentaton error//Level 4
4                    logger.info("printed")                //Level 3
5            #except Exception as e:
6                    #logger.error("Exception occured while order dictionary",exc_info=True)
7            except IndentationError as e:                 //Level 2
8                    logger.error("indentation err",exc_info=True)//Level 3

让我知道您是否还有其他疑问。

答案 2 :(得分:0)

正如alex所言,我们可以遵循相同的方法,一种可行的方法是该方法。 但是,要捕获语法错误,请将try2.py作为模块导入另一个文件中。

try1.py和try2.py分别是python文件。

# try2.py
try:
   import try1
except IndentationError as in_ex:
   print in_ex

#try1.py
def test():
    try:                        
             print "ABC" //2//indentaton error
             logger.info("printed")//3
    #except Exception as e://
            #logger.error("Exception occured while order 
              dictionary",exc_info=True)
    except IndentationError as e://4
            logger.error("indentation err",exc_info=True)//5