在解析器中报告非致命错误的Python方法是什么?

在解析器中报告非致命错误的Python方法是什么?,第1张

在解析器中报告非致命错误的Python方法是什么?

实际上,这些 都是 致命的错误-
至少在能够复制正确游戏方面;另一方面,也许玩家实际上确实做出了非法举动,但当时没有人注意到(这将是警告,而不是致命错误)。

考虑到致命错误(文件已损坏)和警告(进行了非法举动,但随后的举动表明与该举动保持一致(换句话说,用户错误并且当时没有人抓住它))的可能性,我建议结合使用第一个和第二个选项:

  • 当无法继续解析时引发异常
  • 收集所有不排除进一步分析直到结束的错误/警告

如果您没有遇到致命错误,则可以在最后返回游戏,以及所有警告/非致命错误:

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。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5664478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存