对于read
命令行中的用户输入,我不确定从main = do ...
创建实例来报告错误的正确方法。
具体地说,我有一个constructor可以验证其参数并以通常的方式报告错误
-- ...
Right cfg -> cfg
Left err -> error (show err)
以及使用此构造函数的read
的实现。但是,在我的实现中,我有一个cryptic note(继承自我很久以来的一些长期研究),可以删除错误信息
instance Read ... where
readsPrec _ i = case ...
Right cfg -> [(cfg, "")]
Left _ -> [] -- Loses error information, but conforms to specification of 'readsPrec' in 'Read'
main :: IO ()
main = do
... read
仅将
报告由构造函数生成的所有错误。Prelude.read: no parse
如果我忽略了我的神秘评论和instead have
Left err -> error (show err)
在构造函数中,然后我将完整的错误信息报告给用户:
script: Detailed error information here
CallStack (from HasCallStack):
error, called at ./Pkg/Module.hs:371:57 in main:Pkg.Module
(尽管具有堆栈和行信息,但我不想在此情况下报告)。
所以我对此有三个相关的问题:
read
报告来自Left err -> error (show err)
的完整错误信息?Left err -> []
之类的东西,我该如何在命令行报告read
或构造函数错误?和(不那么重要)
read
中的main = do ...
进行报告时,如何摆脱堆栈信息?答案 0 :(得分:0)
error
调用。从纯代码中知道read
(好吧,reads
)失败通常很有用。Read
不同的类进行解析,以便更清楚地报告错误。每个流行的解析器-合并器库都具有用于良好错误报告的功能。errorWithoutStackTrace
。