Foreign.C.Error

Foreign.C.Error

Foreign.C.Error 모듈은 errno의 C에 특화된 오류 처리를 돕는 기능을 제공해요.

출처: Haskell 2010 언어 리포트

본문

module Foreign.C.Error (

    Errno(Errno),  eOK,  e2BIG,  eACCES,  eADDRINUSE,  eADDRNOTAVAIL,  eADV,

    eAFNOSUPPORT,  eAGAIN,  eALREADY,  eBADF,  eBADMSG,  eBADRPC,  eBUSY,

    eCHILD,  eCOMM,  eCONNABORTED,  eCONNREFUSED,  eCONNRESET,  eDEADLK,

    eDESTADDRREQ,  eDIRTY,  eDOM,  eDQUOT,  eEXIST,  eFAULT,  eFBIG,  eFTYPE,

    eHOSTDOWN,  eHOSTUNREACH,  eIDRM,  eILSEQ,  eINPROGRESS,  eINTR,  eINVAL,

    eIO,  eISCONN,  eISDIR,  eLOOP,  eMFILE,  eMLINK,  eMSGSIZE,  eMULTIHOP,

    eNAMETOOLONG,  eNETDOWN,  eNETRESET,  eNETUNREACH,  eNFILE,  eNOBUFS,

    eNODATA,  eNODEV,  eNOENT,  eNOEXEC,  eNOLCK,  eNOLINK,  eNOMEM,  eNOMSG,

    eNONET,  eNOPROTOOPT,  eNOSPC,  eNOSR,  eNOSTR,  eNOSYS,  eNOTBLK,

    eNOTCONN,  eNOTDIR,  eNOTEMPTY,  eNOTSOCK,  eNOTTY,  eNXIO,  eOPNOTSUPP,

    ePERM,  ePFNOSUPPORT,  ePIPE,  ePROCLIM,  ePROCUNAVAIL,  ePROGMISMATCH,

    ePROGUNAVAIL,  ePROTO,  ePROTONOSUPPORT,  ePROTOTYPE,  eRANGE,  eREMCHG,

    eREMOTE,  eROFS,  eRPCMISMATCH,  eRREMOTE,  eSHUTDOWN,  eSOCKTNOSUPPORT,

    eSPIPE,  eSRCH,  eSRMNT,  eSTALE,  eTIME,  eTIMEDOUT,  eTOOMANYREFS,

    eTXTBSY,  eUSERS,  eWOULDBLOCK,  eXDEV,  isValidErrno,  getErrno,

    resetErrno,  errnoToIOError,  throwErrno,  throwErrnoIf,  throwErrnoIf_,

    throwErrnoIfRetry,  throwErrnoIfRetry_,  throwErrnoIfMinus1,

    throwErrnoIfMinus1_,  throwErrnoIfMinus1Retry,  throwErrnoIfMinus1Retry_,

    throwErrnoIfNull,  throwErrnoIfNullRetry,  throwErrnoIfRetryMayBlock,

    throwErrnoIfRetryMayBlock_,  throwErrnoIfMinus1RetryMayBlock,

    throwErrnoIfMinus1RetryMayBlock_,  throwErrnoIfNullRetryMayBlock,

    throwErrnoPath,  throwErrnoPathIf,  throwErrnoPathIf_,

    throwErrnoPathIfNull,  throwErrnoPathIfMinus1,  throwErrnoPathIfMinus1_

  ) where

Foreign.C.Error 모듈은 errno의 C에 특화된 오류 처리를 돕는 기능을 제공해요.

26.1 errno 값의 Haskell 표현 (Haskell representations of errno values)

newtype Errno
  = Errno CInt

errno 값을 나타내는 Haskell 표현이에요. 구현이 의도적으로 노출되어 있는데, 그 이유는 사용자가 자신만의 Errno 값 정의를 추가할 수 있게 하기 위해서예요.

instance Eq Errno

26.1.1 공통 errno 기호 (Common errno symbols)

운영체제 및/또는 C 라이브러리에 따라 서로 다른 errno 값을 지원하는 경우가 많아요. 이 모듈은 공통적인 값들을 정의하지만, Errno가 열린(open) 정의이므로 사용자는 미리 정의되지 않은 정의를 추가할 수도 있어요.

eOK       :: Errno
e2BIG     :: Errno
eACCES    :: Errno
eADDRINUSE :: Errno
eADDRNOTAVAIL :: Errno
eADV      :: Errno
eAFNOSUPPORT :: Errno
eAGAIN    :: Errno
eALREADY  :: Errno
eBADF     :: Errno
eBADMSG   :: Errno
eBADRPC   :: Errno
eBUSY     :: Errno
eCHILD    :: Errno
eCOMM     :: Errno
eCONNABORTED :: Errno
eCONNREFUSED :: Errno
eCONNRESET :: Errno
eDEADLK   :: Errno
eDESTADDRREQ :: Errno
eDIRTY    :: Errno
eDOM      :: Errno
eDQUOT    :: Errno
eEXIST    :: Errno
eFAULT    :: Errno
eFBIG     :: Errno
eFTYPE    :: Errno
eHOSTDOWN :: Errno
eHOSTUNREACH :: Errno
eIDRM     :: Errno
eILSEQ    :: Errno
eINPROGRESS :: Errno
eINTR     :: Errno
eINVAL    :: Errno
eIO       :: Errno
eISCONN   :: Errno
eISDIR    :: Errno
eLOOP     :: Errno
eMFILE    :: Errno
eMLINK    :: Errno
eMSGSIZE  :: Errno
eMULTIHOP :: Errno
eNAMETOOLONG :: Errno
eNETDOWN  :: Errno
eNETRESET :: Errno
eNETUNREACH :: Errno
eNFILE    :: Errno
eNOBUFS   :: Errno
eNODATA   :: Errno
eNODEV    :: Errno
eNOENT    :: Errno
eNOEXEC   :: Errno
eNOLCK    :: Errno
eNOLINK   :: Errno
eNOMEM    :: Errno
eNOMSG    :: Errno
eNONET    :: Errno
eNOPROTOOPT :: Errno
eNOSPC    :: Errno
eNOSR     :: Errno
eNOSTR    :: Errno
eNOSYS    :: Errno
eNOTBLK   :: Errno
eNOTCONN  :: Errno
eNOTDIR   :: Errno
eNOTEMPTY :: Errno
eNOTSOCK  :: Errno
eNOTTY    :: Errno
eNXIO     :: Errno
eOPNOTSUPP :: Errno
ePERM     :: Errno
ePFNOSUPPORT :: Errno
ePIPE     :: Errno
ePROCLIM  :: Errno
ePROCUNAVAIL :: Errno
ePROGMISMATCH :: Errno
ePROGUNAVAIL :: Errno
ePROTO    :: Errno
ePROTONOSUPPORT :: Errno
ePROTOTYPE :: Errno
eRANGE    :: Errno
eREMCHG   :: Errno
eREMOTE   :: Errno
eROFS     :: Errno
eRPCMISMATCH :: Errno
eRREMOTE  :: Errno
eSHUTDOWN :: Errno
eSOCKTNOSUPPORT :: Errno
eSPIPE    :: Errno
eSRCH     :: Errno
eSRMNT    :: Errno
eSTALE    :: Errno
eTIME     :: Errno
eTIMEDOUT :: Errno
eTOOMANYREFS :: Errno
eTXTBSY   :: Errno
eUSERS    :: Errno
eWOULDBLOCK :: Errno
eXDEV     :: Errno

26.1.2 Errno 함수 (Errno functions)

isValidErrno :: Errno -> Bool

주어진 Errno 값이 해당 시스템에서 유효하면 True를 돌려줘요. 이는 ErrnoEq 인스턴스가 유효한 Errno 값에 대해서만 정의되므로 시스템에 의존적이라는 뜻이기도 해요.

getErrno :: IO Errno

현재 스레드에서 errno의 현재 값을 가져와요.

resetErrno :: IO ()

현재 스레드의 errno 값을 eOK로 재설정해요.

errnoToIOError
    :: String  -- ^ 오류가 발생한 위치 (the location where the error occurred)
    -> Errno   -- ^ 오류 번호 (the error number)
    -> Maybe Handle  -- ^ 오류와 연관된 선택적인 핸들 (optional handle associated with the error)
    -> Maybe String  -- ^ 오류와 연관된 선택적인 파일 이름 (optional filename associated with the error)
    -> IOError

주어진 Errno 값에 기반해 IOError를 구성해요. 선택적인 정보는 오류 메시지의 정확성을 높이는 데 사용될 수 있어요.

throwErrno
    :: String  -- ^ 오류 위치에 대한 텍스트 설명 (textual description of the error location)
    -> IO a

getErrno의 현재 값에 대응하는 IOError를 던져요.

26.1.3 실패할 수 있는 IO 연산을 위한 가드 (Guards for IO operations that may fail)

throwErrnoIf
    :: (a -> Bool)  -- ^ IO 연산의 결과 값에 적용할 술어 (predicate to apply to the result value of the IO operation)
    -> String       -- ^ 위치에 대한 텍스트 설명 (textual description of the location)
    -> IO a         -- ^ 실행할 IO 연산 (the IO operation to be executed)
    -> IO a

IO 액션의 결과 값이 주어진 술어를 만족하면 getErrno의 현재 값에 대응하는 IOError를 던져요.

throwErrnoIf_ :: (a -> Bool) -> String -> IO a -> IO ()

throwErrnoIf와 같지만, 오류 처리를 마친 뒤 IO 액션의 결과를 버려요.

throwErrnoIfRetry :: (a -> Bool) -> String -> IO a -> IO a

throwErrnoIf와 같지만, IO 액션이 eINTR 오류 코드를 돌려줄 때 그 액션을 재시도해요. 이는 중단된(interrupted) POSIX 시스템 호출에 대한 표준 재시도 루프에 해당해요.

throwErrnoIfRetry_ :: (a -> Bool) -> String -> IO a -> IO ()

throwErrnoIfRetry와 같지만, 그 결과를 버려요.

throwErrnoIfMinus1 :: Num a => String -> IO a -> IO a

IO 액션이 -1 결과를 돌려주면 getErrno의 현재 값에 대응하는 IOError를 던져요.

throwErrnoIfMinus1_ :: Num a => String -> IO a -> IO ()

throwErrnoIfMinus1과 같지만, 그 결과를 버려요.

throwErrnoIfMinus1Retry :: Num a => String -> IO a -> IO a

IO 액션이 -1 결과를 돌려주면 getErrno의 현재 값에 대응하는 IOError를 던지되, 중단된(interrupted) 연산의 경우에는 재시도해요.

throwErrnoIfMinus1Retry_ :: Num a => String -> IO a -> IO ()

throwErrnoIfMinus1과 같지만, 그 결과를 버려요.

throwErrnoIfNull :: String -> IO (Ptr a) -> IO (Ptr a)

IO 액션이 nullPtr을 돌려주면 getErrno의 현재 값에 대응하는 IOError를 던져요.

throwErrnoIfNullRetry :: String -> IO (Ptr a) -> IO (Ptr a)

IO 액션이 nullPtr을 돌려주면 getErrno의 현재 값에 대응하는 IOError를 던지되, 중단된 연산의 경우에는 재시도해요.

throwErrnoIfRetryMayBlock
    :: (a -> Bool)  -- ^ IO 연산의 결과 값에 적용할 술어 (predicate to apply to the result value of the IO operation)
    -> String       -- ^ 위치에 대한 텍스트 설명 (textual description of the location)
    -> IO a         -- ^ 실행할 IO 연산 (the IO operation to be executed)
    -> IO b         -- ^ 즉시 재시도가 막히면(block) 재시도 전에 실행할 액션 (action to execute before retrying if an immediate retry would block)
    -> IO a

throwErrnoIfRetry와 같지만, 추가로 연산이 eAGAIN 또는 eWOULDBLOCK 오류 코드를 돌려주면 재시도 전에 대체 액션(alternative action)을 실행해요.

throwErrnoIfRetryMayBlock_ :: (a -> Bool)
                                  -> String -> IO a -> IO b -> IO ()

throwErrnoIfRetryMayBlock과 같지만, 그 결과를 버려요.

throwErrnoIfMinus1RetryMayBlock :: Num a => String
                                            -> IO a -> IO b -> IO a

throwErrnoIfMinus1Retry와 같지만, 막힐(block) 연산도 검사해요.

throwErrnoIfMinus1RetryMayBlock_ :: Num a => String
                                            -> IO a -> IO b -> IO ()

throwErrnoIfMinus1RetryMayBlock과 같지만, 그 결과를 버려요.

throwErrnoIfNullRetryMayBlock :: String
                                       -> IO (Ptr a) -> IO b -> IO (Ptr a)

throwErrnoIfNullRetry와 같지만, 막힐(block) 연산도 검사해요.

throwErrnoPath :: String -> FilePath -> IO a

throwErrno와 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

throwErrnoPathIf :: (a -> Bool)
                        -> String -> FilePath -> IO a -> IO a

throwErrnoIf와 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

throwErrnoPathIf_ :: (a -> Bool)
                          -> String -> FilePath -> IO a -> IO ()

throwErrnoIf_와 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

throwErrnoPathIfNull :: String
                              -> FilePath -> IO (Ptr a) -> IO (Ptr a)

throwErrnoIfNull과 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

throwErrnoPathIfMinus1 :: Num a => String
                                     -> FilePath -> IO a -> IO a

throwErrnoIfMinus1과 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

throwErrnoPathIfMinus1_ :: Num a => String
                                     -> FilePath -> IO a -> IO ()

throwErrnoIfMinus1_과 같지만, 적절할 때 예외에 주어진 경로를 포함해요.

더 알아보기 (Learn more)

  • 27장 Foreign.C.String에서 C 문자열 변환을 다뤄요.
  • errnoToIOError를 활용해 C 오류 값을 나만의 IOError로 바꿀 수도 있어요.