【发布时间】:2014-12-09 01:03:00
【问题描述】:
我创建的解析器从文件中读取记录的国际象棋游戏。 API 的使用方式如下:
import chess.pgn
pgn_file = open("games.pgn")
first_game = chess.pgn.read_game(pgn_file)
second_game = chess.pgn.read_game(pgn_file)
# ...
有时会遇到非法移动(或其他问题)。有什么好的 Pythonic 方式来处理它们?
一旦遇到错误就引发异常。然而,这使得每一个问题都是致命的,因为执行停止了。通常,仍有有用的数据已被解析并可以返回。另外,你不能简单地继续解析下一个数据集,因为我们还在一些半读数据的中间。
累积异常并在游戏结束时引发异常。这会使错误再次致命,但至少您可以抓住它并继续解析下一场比赛。
-
像这样引入一个可选参数:
game = chess.pgn.read_game(pgn_file, parser_info) if parser_info.error: # This appears to be quite verbose. # Now you can at least make the best of the sucessfully parsed parts. # ...
这些或其他方法中的一些是否已在野外使用?
【问题讨论】:
-
有许多不同的选项 - 使用
logging(例如,只是警告无法解析游戏某某),还有一个额外的suppress_errors参数,...您想要返回部分阅读的游戏吗?刚刚跳过?这应该是一个选择吗?这太宽泛了,无法真正正确回答——你必须决定你想让你的 API 做什么(然后记录下来!) -
第三个选项不是必须的;您可以定义一个自定义异常,其中包含
parser_info将包含的任何信息。 -
一篇不错的博文在这里。 jeffknupp.com/blog/2013/02/06/… 这个问题实际上是 LBYL 与 EAFP 的风格问题。 Python 更喜欢 EAFP,并且更简洁地引发异常或通过。我认为在实例化游戏之前将异常列表编译回用户是一个更好的选择。也许使用 while info.error: 继续将输入发送回用户。这不是致命的,只是验证。
标签: python exception-handling error-handling warnings