2011-06-20 36 views
3

我知道這有另一個線程,但它並沒有解決我的問題,請閱讀我的問題!Python捕捉異常時,我如何獲得行號?

基本上,我正在解析一個YAML文件,以確保它有我想要的所有正確的鍵和值。如果YAML文件有不正確的值或密鑰,那麼我想打印一條消息,指出錯誤的值或密鑰的位置。

例:
我們先來說說這個YAML文件:

Groceries:
Apples: Granny
Milk: Skim
Bread: Wheat

比方說,我期待「全」作爲「牛奶」的值。如果該行是第3行,如何打印「LINE 3上出現錯誤:無效值等於等於」消息?

非常感謝!

+0

逐行讀取文件中的行和打印計數器的當前行號,當你得到一個錯誤? – normalppl

+0

對不起,我對Python和編程一般都很陌生。你可以給我一個例子嗎?你是說創建說計數器還是已經存在? – Ken

+0

不知道如何解析你的文件。但如果你只是使用一些外部庫並得到一個異常,你可以使用traceback.tb_lineno。 http://docs.python.org/library/traceback.html – normalppl

回答

5

從PyYaml文檔

>>> try: 
...  yaml.load("unbalanced blackets: ][") 
... except yaml.YAMLError, exc: 
...  if hasattr(exc, 'problem_mark'): 
...   mark = exc.problem_mark 
...   print "Error position: (%s:%s)" % (mark.line+1, mark.column+1) 

Error position: (1:22) 
+0

我知道這有點舊,但我認爲'mark.line + 1'只需要'mark.line'。 –

+0

我不認爲這回答了問題 - 提問者關心數據驗證,而不是語法驗證。該示例是有效的YAML,因此加載它不會拋出YAMLError。 – hdgarrood

+0

沒有+1,行和列號似乎從0開始。 –

0

我不得不問題的類似要求。我找不到python解決方案,但發現kwalify - http://www.kuwata-lab.com/kwalify。您可以將其用作命令行工具。它允許您將鍵和允許的值指定爲模式。然後您驗證YAML文件,如下所示:

kwalify -f schema.yaml document.yaml