实际上,这些 都是 致命的错误-
至少在能够复制正确游戏方面;另一方面,也许玩家实际上确实做出了非法举动,但当时没有人注意到(这将是警告,而不是致命错误)。
考虑到致命错误(文件已损坏)和警告(进行了非法举动,但随后的举动表明与该举动保持一致(换句话说,用户错误并且当时没有人抓住它))的可能性,我建议结合使用第一个和第二个选项:
- 当无法继续解析时引发异常
- 收集所有不排除进一步分析直到结束的错误/警告
如果您没有遇到致命错误,则可以在最后返回游戏,以及所有警告/非致命错误:
return game, warnings, errors
但是,如果您遇到致命错误怎么办?
没问题:创建一个自定义例外,您可以将游戏的可用部分以及任何其他警告/非致命错误附加到该例外:
raise ParsingError( 'error explanation here', game=game, warnings=warnings, errors=errors, )
那么当您发现错误时,您可以访问游戏的可恢复部分,以及警告和错误。
自定义错误可能是:
class ParsingError(Exception): def __init__(self, msg, game, warnings, errors): super().__init__(msg) self.game = game self.warnings = warnings self.errors = errors
并在使用中:
try: first_game, warnings, errors = chess.pgn.read_game(pgn_file)except chess.pgn.ParsingError as err: first_game = err.game warnings = err.warnings errors = err.errors # whatever else you want to do to handle the exception
这类似于
subprocess模块处理错误的方式。
为了在游戏出现致命错误后能够检索和解析后续游戏,我建议您更改API:
- 有一个游戏迭代器,它仅返回每个游戏的原始数据(它只需要知道如何分辨一个游戏何时结束以及下一个游戏开始)
- 让解析器获取原始游戏数据并进行解析(因此不再负责您碰巧在文件中的位置)
这样,如果您有5个游戏文件并且两个游戏都死了,您仍然可以尝试解析游戏3、4和5。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)