使用Asio同步随机读取遇异常时,如何获取已读取字节数?
问题:随机访问文件同步读抛出异常时,如何获取已读取字节数?
调用随机访问设备(例如random_access_file)的同步读取操作时,若抛出异常,如何得知已读取的字节数?是否该场景不被支持,必须使用boost::system::error_code重载版本才能获取已读取字节数?
示例代码:
error_code ec; size_t s = a.read_some_at(offset, buffers, ec); offset += s; // need to be done before unwinding if (ec) throw system_error(ec); return s;
回答
是的,必须使用带boost::system::error_code参数的重载版本才能在发生错误时获取已读取的字节数。
当使用会抛出异常的重载版本时,一旦操作中途出错抛出异常,流程会被直接中断,你没有机会获取到已经成功读取的字节数——因为这类重载只会在操作完全成功时返回读取量,出错时直接抛出异常,不会返回任何部分读取的结果。
而带error_code参数的重载则不同:它会优先返回已经成功读取的字节数,再通过传入的error_code对象告知是否发生了错误。就像示例代码里展示的那样,你可以先更新偏移量(把已读取的字节数记录下来),再检查错误码,最后根据情况抛出异常。这样即使操作中途出错,也能保留住已读取的字节数信息。
内容的提问来源于stack exchange,提问作者Johannes Schaub - litb
相关产品推荐
相关产品推荐

