「这是我参与11月更文挑战的第 15 天,活动详情查看:2021最后一次更文挑战」
错误处理
你可能已经注意到,在整个代码中,一直都在引用一个 SQLRiteError 类型。这是我使用 thiserror crate 定义的错误类型,它很容易使用的库,为标准库的 std::error::Error 特质提供了一个方便的衍生宏。不过提到我遇到了这个trait,它基本上解决了很多问题,代码看起来超级干净!目前的错误模块,位于 src/error.rs 中。
1 | rust复制代码use thiserror::Error; |
简单介绍一下
Rust界的大佬 dtolnay 设计了两个crate:thiserror 和 anyhow。在这之前已经有很多提升错误处理的库了,但最后最终还是解决 thiserror + anyhow 是最易用和实用的。
注意事项:
thiserror是给lib使用的,而anyhow是给bin程序使用,当然bin程序可以使用thiser+anyhow,但是切记anyhow不要在lib里面使用 。
而我们在上面的 SQLRiteError 定义中,使用的就是 thiserror 的包装,其实就是使用 enum 封装的思路。
1 | rust复制代码use anyhow::Result; |
而 anyhow 使用上,直接返回 anyhow::Result,因为它实现了 From<E> where E: Error,所以就不用再维护一个 enum 类型。
暂时总结
目前我们成功地解析了用户的命令,区分了 MetaCommand 和 SQLCommand。以及实现了一个可扩展的MetaCommand 模块,使得将来增加更多的命令变得容易。
然后添加了sql模块,通过使用 sqlparser-rs crate,我们成功地解析了SQL语句,并能够从每个SQL语句中生成一个 ast。我们已经从 CREATE TABLE SQL 语句中解析并生成了至少一个简化版的字节码,可以进入数据库(将在后面进行)。最后,我们还创建了一个错误模块,所以我们有一个标准化的方法来处理整个应用程序的错误。
本文转载自: 掘金