我正在尝试在我的代码中加入错误处理。
我正在调用一个函数
generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg)
=> X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg
-> m (Either Error CertificationRequest)
所以在这种情况下我需要处理错误。我以为我可以做这样的事情
case generateCSR (parameters) of
Right req -> req
left Error -> putStrLn ("Error : " ++ show Error)
但这似乎行不通。
但是如果我做这样的事情
Right req <- generateCSR (parameters)
putStrLn.show req
它给了我一个输出。
如何在此处实现错误处理?在第一种情况下,我是否做错了什么(case of
声明)?
不确定如何将单个parameters
传递给generateCSR
,因为它需要 4 个参数,但我会将其归结为伪代码。
generateCSR
返回一个包裹在某个 monandm
中的Either
,它必须是MonadRandom
的实例,IO
是其中的候选实例。 您不能直接对结果使用案例;您必须使用 monad 的绑定来访问其中的Either
。 在第二个示例中,您使用了 bind 与要求Right
Either
的模式,这不会优雅地处理它Left
的情况。 相反,您可以将结果绑定到变量,然后使用 case 语句来决定要执行的操作:
f = do
r <- generateCSR parameters
case r of
Left err -> ...
Right req -> ...
请注意,这两种情况还必须返回包装在同一个 monad 中的内容,这是do
(绑定) 的要求。