「这是我参与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
语句中解析并生成了至少一个简化版的字节码,可以进入数据库(将在后面进行)。最后,我们还创建了一个错误模块,所以我们有一个标准化的方法来处理整个应用程序的错误。
本文转载自: 掘金