如何让Cassava的解码错误信息包含CSV出错行号?
让Cassava解码错误包含CSV行号的方法
要让decode生成的错误信息包含报错的CSV行号,你可以利用Cassava的Parser monad自带的位置跟踪能力,具体做法如下:
正确使用Parser的错误抛出方式:在
FromField的parseField实现中,不要用普通的error或外部异常,而是使用Parsermonad提供的fail(或parserFail)函数抛出错误。Cassava会自动将当前解码的行号、列号附加到错误信息中。
示例代码:import Data.Csv (FromField(..), Field) data MyType = Valid | Invalid deriving (Show) instance FromField MyType where parseField field = if field == "valid" then pure Valid else fail "无效的字段值"当解码出错时,错误信息会自动带上行号,比如
"第3行:无效的字段值"。自定义带位置的错误信息:如果需要更精确的位置展示(比如同时显示行号和列号),可以用
getPosition函数获取当前解码位置,手动构造包含行号的错误信息:import Data.Csv (FromField(..), Field, Parser, Position(..), getPosition) instance FromField MyType where parseField field = do pos <- getPosition if field == "valid" then pure Valid else fail $ "第" ++ show (posLine pos) ++ "行,第" ++ show (posCol pos) ++ "列:字段值无效"这样错误信息会明确标注出错的行和列位置。
需要注意的是,Cassava的decode系列函数返回的Either String a中,左侧的错误字符串已经整合了解码位置信息,只要你在Parser内部抛出错误,就会自动包含行号。
内容的提问来源于stack exchange,提问作者thirsty
相关产品推荐
相关产品推荐

