Что-тот я туплю по этой статье с самого начала, где про асинхронные ужасы parse_line.
Да, read_exact может быть запаузена.
Но как это, черт побери, может привести к ошибке преобразования в строку далее из-за самой асинхронности, а не из-за инвалидных данных в потоке?
read_exact должно считать строго заданное к-во байтов или вернуть ошибку.
Если та сторона вернула правильный PDU, вот это вот с длинной и правильной последовательностью utf8 заданной длины, то откуда тут возьмется "invalid UTF-8"?