You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Cassava的解码错误信息包含CSV出错行号?

让Cassava解码错误包含CSV行号的方法

要让decode生成的错误信息包含报错的CSV行号,你可以利用Cassava的Parser monad自带的位置跟踪能力,具体做法如下:

  • 正确使用Parser的错误抛出方式:在FromField的parseField实现中,不要用普通的error或外部异常,而是使用Parser monad提供的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:01:22