Главная » Haskell » Модуль Error для работы с ошибками Haskell

0

В  модуле Error определено  множество функций  для работы с  ошибками ввода/вывода. Также  в нём определено  несколько  специализированных типов для представления таких ошибок. Использование модуля:

import  System.IO.Error

Главный тип  данных, вокруг  которого  всё вращается в  этом  модуле, — IOError. В этом модуле он определён в виде синонима типа для представления исключений, хотя в стандарте Haskell-98 он является непрозрачным примитивным типом.

Тип: IOError

Описание: представление ошибки ввода/вывода. Любое действие ввода/вывода может сгенерировать исключение этого типа вместо того, чтобы вернуть результат. Информация о типе IOException  приведена на стр. 200.

Определение:

type  IOError =  IOException

Функция: userError

Описание: создаёт пользовательскую ошибку с заданным строковым описанием. Метод fail класса Monad (см. стр. 211) для монады IO  всегда генерирует эту ошибку.

Определение:

userError :: String ->  IOError

Функция определена в виде примитива.

Функция: mkIOError

Описание: создаёт ошибку заданного типа и прочими атрибутами ошибки.

Определение:

mkIOError  :: IOErrorType  ->  String ->  Maybe Handle ->  Maybe FilePath ->  IOError mkIOError  t location maybe_hdl maybe_filename = IOError

{

ioe_type = t, ioe_location =  location, ioe_description  =  “”, ioe_handle  = maybe_hdl,

ioe_filename =  maybe_filename

}

Функция: annotateIOError

Описание: добавляет к ошибке описание и, возможно, место, где она возникла, в виде полного пути к файлу и дескриптора файла.

Определение:

annotateIOError :: IOError ->  String ->  Maybe Handle > Maybe FilePath  ->  IOError annotateIOError (IOError  ohdl  errTy   _ str opath)   loc   hdl  path

= IOError (hdl ‘mplus‘ ohdl) errTy   loc   str (path  ‘mplus‘ opath)  where

Nothing  ‘mplus‘ ys  =  ys xs           ‘mplus‘ _    =  xs

Функция: isAlreadyExistsError

Описание: возвращает значение IO True в случае, если заданная ошибка проявляется тогда, когда исключение сгенерировано при наличии одного из аргументов.

Определение:

isAlreadyExistsError ::  IOError ->  Bool

isAlreadyExistsError = isAlreadyExistsErrorType .  ioeGetErrorType

Функция: isDoesNotExistError

Описание: возвращает значение IO True в случае, если заданная ошибка проявляется тогда, когда исключение сгенерировано при отсутствии одного из аргументов.

Определение:

isDoesNotExistError ::  IOError ->  Bool

isDoesNotExistError = isDoesNotExistErrorType .  ioeGetErrorType

Функция: isAlreadyInUseError

Описание: возвращает значение IO True в случае, если заданная ошибка проявляется из-за того, что один из аргументов функции является однопользовательским ресурсом и он занят другим процессом в момент вызова.

Определение:

isAlreadyInUseError :: IOError  ->  Bool

isAlreadyInUseError = isAlreadyInUseErrorType .  ioeGetErrorType

Функция: isFullError

Описание: возвращает значение True в случае, если заданная ошибка проявляется из-за того, что устройство, в которое производится запись, полностью заполнено.

Определение:

isFullError :: IOError  ->  Bool

isFullError = isFullErrorType .  ioeGetErrorType

Функция: isEOFError

Описание: возвращает значение True в случае, если заданная ошибка проявляется из-за того, что процесс чтения подошёл к концу файла или потока информации.

Определение:

isEOFError  :: IOError  ->  Bool

isEOFError  = isEOFErrorType  .  ioeGetErrorType

Функция: isIllegalOperation

Описание: возвращает значение True в случае, если заданная ошибка проявляется из-за того, что операция ввода/вывода недопустима. Любая функция, возвращающая значение в монаде IO, может сгенерировать исключение этого типа. Определение:

isIllegalOperation :: IOError  ->  Bool

isIllegalOperation = isIllegalOperationErrorType .  ioeGetErrorType

Функция: isPermissionError

Описание: возвращает значение True в случае, если заданная ошибка проявляется из-за того, что для выполнения операции ввода/вывода отсутствуют права доступа.

Определение:

isPermissionError :: IOError  ->  Bool

isPermissionError = isPermissionErrorType .  ioeGetErrorType

Функция: isUserError

Описание: возвращает значение True в случае, если заданная ошибка является ошибкой, которая определена программистом.

Определение:

isUserError ::  IOError ->  Bool

isUserError = isUserErrorType .  ioeGetErrorType

Функция: ioeGetErrorType

Описание: возвращает тип заданной ошибки. Является синонимом для автоматически сгенерированного метода доступа к полю типа IOError.

Определение:

ioeGetErrorType :: IOError ->  IOErrorType  ioeGetErrorType  ioe  = ioe_type ioe

Функция: ioeGetErrorString

Описание: возвращает строку-описание  заданной ошибки. Является синонимом для автоматически сгенерированного метода доступа к  полю строки-описания IOError в случае, если ошибка не является созданной пользователем. Определение:

ioeGetErrorString ::  IOError ->  String

ioeGetErrorString ioe  | isUserErrorType (ioe_type ioe)  =  ioe_description ioe

| otherwise                                     = show (ioe_type ioe)

Функция: ioeGetHandle

Описание: возвращает дескриптор источника данных, при работе с которым произошла заданная ошибка. Является синонимом для автоматически сгенерированного метода доступа к полю дескриптора IOError.

Определение:

ioeGetHandle  :: IOError ->  Maybe Handle ioeGetHandle  ioe  = ioe_handle ioe

Функция: ioeGetFileName

Описание: возвращает путь к файлу, при работе с которым  произошла заданная ошибка. Является синонимом для автоматически сгенерированного  метода доступа к полю пути к файлу IOError.

Определение:

ioeGetFileName  :: IOError ->  Maybe  FilePath ioeGetFileName  ioe  =  ioe_filename ioe

Функция: ioeSetErrorType

Описание: устанавливает тип заданной ошибки. Является синонимом для автоматически сгенерированного метода установки к полю типа IOError. Определение:

ioeSetErrorType :: IOError ->  IOErrorType  ->  IOError ioeSetErrorType ioe  errtype = ioe  {  ioe_type = errtype }

Функция: ioeSetErrorString

Описание: устанавливает строку-описание заданной ошибки. Является  синонимом для автоматически сгенерированного  метода установки  к  полю строкиописания IOError.

Определение:

ioeSetErrorString :: IOError ->  String ->  IOError ioeSetErrorString ioe  str = ioe  { ioe_description  = str }

Функция: ioeSetHandle

Описание: устанавливает дескриптор источника данных, при работе с которым произошла заданная ошибка. Является синонимом для автоматически сгенерированного метода уставноки к полю дескриптора IOError.

Определение:

ioeSetHandle  :: IOError ->  Handle ->  IOError ioeSetHandle  ioe  hdl  = ioe  { ioe_handle =  Just  hdl  }

Функция: ioeSetFileName

Описание: устанавливает путь к файлу, при работе с которым произошла заданная ошибка. Является синонимом для автоматически сгенерированного  метода установки к полю пути к файлу IOError.

Определение:

ioeSetFileName  :: IOError ->  FilePath ->  IOError

ioeSetFileName  ioe  filename = ioe  { ioe_filename = Just  filename }

Тип: IOErrorType

Описание: абстрактный примитивный тип-перечисление, представляющий типы ошибок ввода/вывода.

Определение:

data  IOErrorType  = …

Тип определён в виде примитива.

Функция: alreadyExistsErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если какой-либо аргумент действия ввода/вывода уже существует. Определение:

alreadyExistsErrorType ::  IOErrorType alreadyExistsErrorType =  AlreadyExists

Функция: doesNotExistErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если какой-либо аргумент действия ввода/вывода не существует. Определение:

doesNotExistErrorType ::  IOErrorType doesNotExistErrorType =  NoSuchThing

Функция: alreadyInUseErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если какой-либо аргумент действия ввода/вывода является однопользовательским и на момент доступа к нему заблокирован другим процессом. Определение:

alreadyInUseErrorType ::  IOErrorType alreadyInUseErrorType =  ResourceBusy

Функция: fullErrorType

Описание: константная  функция, возвращающая тип ошибки,  которая  происходит в случае, если устройство, в которое  пытается записать действие ввода/вывода, уже заполнено полностью.

Определение:

fullErrorType ::  IOErrorType

fullErrorType = ResourceExhausted

Функция: eofErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если во входном файле или потоке достигнут конец.

Определение:

eofErrorType ::  IOErrorType eofErrorType = EOF

Функция: illegalOperationErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если совершаемое действие ввода/вывода недопустимо. Определение:

illegalOperationErrorType ::  IOErrorType illegalOperationErrorType  =  IllegalOperation

Функция: permissionErrorType

Описание: константная функция, возвращающая тип ошибки, которая происходит в случае, если для совершения действие ввода/вывода  нет прав доступа. Определение:

permissionErrorType ::  IOErrorType permissionErrorType  =  PermissionDenied

Функция: userErrorType

Описание: константная функция, возвращающая тип ошибки, которая определена программистом.

Определение:

userErrorType ::  IOErrorType userErrorType =  UserError

Функция: isAlreadyExistsErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если какой-либо аргумент действия ввода/вывода уже существует.

Определение:

isAlreadyExistsErrorType :: IOErrorType  ->  Bool

isAlreadyExistsErrorType  AlreadyExists = True isAlreadyExistsErrorType _                         =  False

Функция: isDoesNotExistErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если какой-либо аргумент действия ввода/вывода не существует.

Определение:

isDoesNotExistErrorType ::  IOErrorType  ->  Bool isDoesNotExistErrorType  NoSuchThing  = True isDoesNotExistErrorType _                     =  False

Функция: isAlreadyInUseErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если какой-либо аргумент действия ввода/вывода является однопользовательским и на момент доступа к нему заблокирован другим процессом.

Определение:

isAlreadyInUseErrorType ::  IOErrorType  ->  Bool isAlreadyInUseErrorType  ResourceBusy = True isAlreadyInUseErrorType _                       =  False

Функция: isFullErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если устройство, в которое пытаются записать действие ввода/вывода, уже заполнено полностью. Определение:

isFullErrorType ::  IOErrorType  ->  Bool isFullErrorType  ResourceExhausted = True isFullErrorType _                                =  False

Функция:  isEOFErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если во входном файле или потоке достигнут конец.

Определение:

isEOFErrorType  :: IOErrorType  ->  Bool isEOFErrorType  EOF  =  True isEOFErrorType  _     =  False

Функция: isIllegalOperationErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если совершаемое действие ввода/вывода  недопустимо.

Определение:

isIllegalOperationErrorType :: IOErrorType  ->  Bool isIllegalOperationErrorType  IllegalOperation = True isIllegalOperationErrorType _                              =  False

Функция: isPermissionErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, произошедшей в случае, если для совершения действие ввода/вывода  нет прав доступа.

Определение:

isPermissionErrorType :: IOErrorType  ->  Bool isPermissionErrorType  PermissionDenied   = True isPermissionErrorType _                              =  False

Функция: isUserErrorType

Описание: предикат, возвращающий  значение True тогда, когда  заданный тип ошибки является типом ошибки, которая определена программистом. Определение:

isUserErrorType :: IOErrorType  ->  Bool isUserErrorType  UserError = True isUserErrorType _                 =  False

Функция: ioError

Описание: генерирует ошибку ввода/вывода заданного типа.

Определение:

ioError :: IOError ->  IO a

Функция определена в виде примитива.

Функция: catch

Описание: устанавливает функцию,  которая  обрабатывает   сгенерированную ошибку  ввода/вывода, если она произошла во  время выполнения заданного действия. Первым аргументом  функции является монадическое  действие ввода/вывода, которое непосредственно выполняется.  Если во время его выполнения произошла ошибка, то для её обработки  используется  функция, задаваемая вторым аргументом. Сама функция catch  возвращает  либо результат самого действия, либо результат обработки ошибки.

Определение:

catch  :: IO a ->  (IOError ->  IO  a)  ->  IO a

Функция определена в виде примитива.

Функция: try

Описание: вариант функции catch, который обрабатывает ошибки ввода/вывода при помощи идиомы типа Either (см. подробности в разделе 8.8.). Эта функция не обрабатывает исключения, которые  возникают не в процессе ввода/вывода. Для их обработки  необходимо пользоваться одноимённой функцией из модуля Exception  (см. раздел 7.4.).

Определение:

try :: IO a ->  IO  (Either  IOError a) try f  =  catch  (do  r < f

return  (Right  r)) (return  .  Left)

Функция: modifyIOError

Описание: отлавливает ошибку ввода/вывода и генерирует  её изменённую  версию. Изменение производится при помощи заданной первым аргументом функции.

Определение:

modifyIOError :: (IOError ->  IOError) ->  IO a ->  IO a

Функция определена в виде примитива.

11.7.2.    Модуль Unsafe

Модуль Unsafe предоставляет программисту две функции, которые позволяют «вынуть» из монады IO значения. Использование:

import  System.IO.Unsafe

Функция: unsafePerformIO

Описание: возвращает значение из монады IO. Это единственная функция, которая позволяет получить немонадическое значение из этой монады. Само собой разумеется, что функция не является безопасной, поскольку в случае недетерминированности и наличия сторонних эффектов результат выполнения функции также будет недетерминированным.

Определение:

unsafePerformIO   ::  IO  a ->  a

Функция определена в виде примитива.

Если вычисления, поданные на вход этой функции, содержат сторонние эффекты, то относительный порядок проведения операций со сторонними эффектами (конечно, в рамках монады IO) не определён. При использовании этой функции необходимо быть очень осторожным.

Функция: unsafeInterleaveIO

Описание: позволяет отложить  (в  смысле ленивости) действия  ввода/вывода в монаде IO. Заданное действие выполняется только тогда (равно как и его сторонние эффекты), когда значение a, обёрнутое в монаду, требуется для вычислений. Эта функция используется, к примеру, для реализации ленивого чтения файлов.

Определение:

unsafeInterleaveIO :: IO a  ->  IO a

Функция определена в виде примитива.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии