Парсер, который я создал, читает записанные шахматные игры из файла. API используется так:Что такое Pythonic способ сообщить о нефатальных ошибках в парсере?
import chess.pgn
pgn_file = open("games.pgn")
first_game = chess.pgn.read_game(pgn_file)
second_game = chess.pgn.read_game(pgn_file)
# ...
Иногда нелегальные ходы (или другие проблемы) встречаются. Что такое хороший питоновский способ справиться с ними?
Исключение исключений, как только возникнет ошибка. Однако это делает каждую проблему фатальной, при этом выполнение останавливается. Часто все еще есть полезные данные, которые были проанализированы и могут быть возвращены. Кроме того, вы не можете просто продолжить разбор следующего набора данных, потому что мы все еще находимся в середине некоторых получитаемых данных.
Накопительные исключения и повышение их в конце игры. Это снова приводит к ошибке, но, по крайней мере, вы можете поймать ее и продолжить разбор следующей игры.
Ввести дополнительный аргумент вроде этого:
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 выполнял (тогда документируйте его!) – jonrsharpe
Третий вариант не нужен; вы можете определить настраиваемое исключение, которое включает в себя любую информацию, содержащуюся в 'parser_info'. – chepner
Хороший пост в блоге. https://www.jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/ вопрос действительно вопрос стиля LBYL против EAFP. Python предпочитает EAFP и более лаконично поднимать исключение или проходить. Я думаю, что компиляция списка исключений для пользователя перед созданием игры - лучший выбор. Возможно, используйте while info.error: чтобы отправить запрос обратно пользователю. Это не смертельно, просто проверка. –