2015-01-21 2 views
2

도관 내에서 발생하는 오류를 잡는 방법을 이해하려고합니다. 나는 콘딧에 catchC을 적용함으로써, 나는 기분이 나쁠 때 재방송 할 새로운 도관을 만들 수 있다고 믿었습니다.도관의 오류를 복구 할 수 없습니다.

아래 예제에서 부울 값에 따라 사용자 정의 더미 예외가 발생하는 소스가 있습니다. 그 예외에 그 부울 리드의 값이 던져지는 처음 catchC 내부 그러나 핸들러 내가이 확신 (10 1에서 숫자를 산출) 반대 동작을 나타해야 새로운 도관

{-# LANGUAGE DeriveDataTypeable #-} 

module Main where 

import Data.Conduit 
import qualified Data.Conduit.List as CL 
import Control.Monad.IO.Class 
import Control.Exception 
import Data.Typeable 

data MyException = MyException String 
    deriving (Show, Typeable) 

instance Exception MyException where 

listAsStream :: Bool -> Source IO Int 
listAsStream val = if val then CL.sourceList [1..10] else throw $ MyException "Value" 

conduitWhatever :: Sink Int IO() 
conduitWhatever = awaitForever $ liftIO . print 

main :: IO() 
main = catchC (listAsStream False) handler $$ conduitWhatever 

handler :: MyException -> Source IO Int 
handler _= catchC (listAsStream True) handler 

을 생산 catchC이 어떻게 작동하는지 오해했습니다. 아무도 내가 잘못한 것을 설명 할 수 있습니까?

고맙습니다.

답변

5

catchC의 사용법은 정확합니다. 문제는 적절한 IO 예외 대신 부정확 한 예외를 도입하는 throw의 사용입니다. 대신 다음을 사용하는 경우 :

liftIO $ throwIO $ MyException "Value" 

프로그램이 예상대로 작동합니다.

관련 문제