Понятие об ошибке – одно из фундаментальных
понятий Управления Ресурсами Экипажа
(СRМ).
Полностью исключить ошибки из деятельности
человека невозможно. Ошибки – стиль
жизни. Мы изучаем реальность методом
«проб и ошибок», воспринимаем ее не
объективно, под влиянием чувств,
настроений, состояния. 2 тысячи лет назад
Цицерон сказал: «Человеку свойственно
ошибаться».
Неизбежность ошибок означает, что мало
уметь действовать правильно, необходимо
научиться:
-
предупреждать;
-
обнаруживать;
-
исправлять
ошибки.
Американский ученый Джеймс Ризон считает
ошибками случаи, когда плановая умственная
или физическая деятельность, не достигает
результата. Ошибка– «незапланированное
действие». Мы или делаем то, что не должны
(ошибка исполнения), или не делаем то,
что должны сделать (пропуски). В любом
случае, результат не соответствует
намерениям.
4.8.1 Теория и модель ошибок человека
Исследования показывают, что опытные
экипажи в нормальных условиях допускают
3 — 5 ошибок в час (неправильный прием
информации, выбор кнопок, пропуск
радиовызова или пункта ККП).
Основные
категории ошибок:
-
Латентные
— (скрытые) ошибки (условия или события
в прошлом, например, ошибки в конструкции
ВС). -
Активные
– непосредственные ошибки или
действия, ставшие причиной ошибок
(пусковые события).
Активные ошибки подразделяют на
3 вида – ошибки, связанные:
-
с
навыками; -
правилами;
-
знаниями.
Принципиальная разница между ними
состоит в режиме работы сознания. При
автоматической деятельности участие
сознания минимально, используемый объем
до 10% и возможно одновременное выполнение
других задач (напр., пилотирование и
ведение радиосвязи).
Сознательная деятельность, основанная
на знаниях, связана с работой долговременной
памяти, использует ресурсы внимания
почти полностью, может сочетаться только
с автоматической деятельностью, не
допускает совмещения с даже простыми
логическими или процедурными задачами.
Процедурная (основанная на правилах)
деятельность по расходу ресурсов
внимания и возможности совмещения
занимает промежуточное между автоматической
и сознательной деятельностью место.
Ошибки, связанные с навыками.
Большинство привычных действий, основано
на хорошо освоенных навыках: ходьба и
речь, ручное пилотирование ВС – относятся
к автоматическим действиям. Автоматическое
поведение, почти, не нуждается в контроле
сознания. Сознательный контроль может
затруднять исполнение.
Навык формируется многократным
повторением. Осознанное исполнение
повышает качество обучения.
Ошибки, связанные с навыками, обычно,
— результат или недостаточного или
чрезмерного внимания, уделяемого задаче
(низкой или чрезмерной мотивации),
возвращения старого навыка (первые
навыки прочнее) или замещения, когда
вместо одного действия выполняется
другое (вместо шасси закрылки).
К ошибкам, связанным с навыками, относятся
непроизвольные движения, ошибки,
обусловленные различием в компоновке
кабин ВС, реверсии и другие, ненамеренные
действия.
Ошибки, связанные с правилами.
Сложные действия требуют участия
сознания. При решении стандартных задач
мы пользуемся набором житейских или
профессиональных правил, которые
экономят и силы и время. При решении
однотипных задач формируется (сознательно
или неосознанно) стереотип действий,
который с одной стороны облегчает
выполнение задачи, с другой стороны
снижает уровень осознанности. Происходит
нечто вроде автоматизации процедурной
деятельности.
Возможны ошибки, связанные с неверным
выбором правила или процедуры. Например,
экипаж может неправильно определить
отказ и, соответственно, применить
неверную процедуру, в результате отказ
не будет парирован. Причиной ошибки
может быть недоученность, неспособность
вспомнить процедуру.
Ошибки, обусловленные различием в
компоновкекабин, происходят из-за
переноса навыка выполнения какой-либо
задачи с помощью определенного органа
управления.
Реверсиипроисходят, когда
сложившийся стереотип не нужен, но
используется машинально. Это происходит,
когда пилот не сосредоточен или в
состоянии стресса.
Ошибки, связанные со знаниями
В нестандартных ситуациях, для которых
нет правил, при выработке решения мы
опираемся на знания и опыт. Ошибки,
связанные со знаниями, возникают в
сложных ситуациях. При этом членам
экипажа точно не известна суть проблемы,
и нет уверенности, что решение даст
желаемый результат.
Ошибки, основанные на знаниях, связаны
с неполными или неверными знаниями, или
неверной интерпретацией ситуации.
Примером служит неправильная оценка
ситуации из-за неточного понимания
принципа работы системы ВС. Если член
экипажа уже сталкивался с аналогичной
ситуацией, он может посмотреть
дополнительную информацию, чтобы
убедиться в правильности своего
понимания, а может не посмотреть….
Концепция «цепи ошибок»
Практически никогда инцидент не
происходит из-за одной единственной
ошибки. При расследовании АП и инцидентов,
обычно, выясняется, что в его основе
лежит несколько ошибок, зачастую
допущенных разными людьми.
Когда одна ошибка создает условия для
возникновения другой, усложняет условия
выполнения следующей задачи и провоцирует
новые ошибки, говорят о возникновении
«цепи ошибок». Работа такой «цепи»
разрушает нормальное взаимодействие
в экипаже и может привести к инциденту.
Если «разорвать» любое звено цепи, то
ее развитие прекратится и ситуация
нормализуется. «Разрывают» цепь с
помощью системных инструментов:
-
Стандартных Процедур (СП);
-
Карт Контрольных Проверок (ККП);
-
Правил CRMи т.д.
Ошибки могут бытьследствием
умышленного или неумышленного поведения
и их можно подразделить на промахи,
упущения и заблуждения в зависимости
от преднамеренности их совершения:
-
промахи – неумышленные действия,
вызванные недостатком необходимого
внимания в результате отвлечений,
нарушения порядка или несвоевременных
действий (например, пилоту была известна
нужная частота, но он ошибочно установил
другую); -
упущения– неумышленные действия
по причине провалов памяти, когда
забываются
собственные намерения, возникает
дезориентация или не выполняются
запланированные
действия (например, пилот знал, что ему
необходимо доложить о занятии нужной
высоты, но забыл это сделать);
-
заблуждения– преднамеренные
действия, вызванные плохим планированием,
а не
умышленным решением нарушить
установленные правила или процедуры
(например,
командир воздушного судна решает
следовать на запасной аэродром с
подходящим прогнозом погоды, но не
имеющим адекватного наземного
оборудования для данного типа ВС ).
Заблуждения основываются на применении
«правил», которые мы создаем на
основании нашего личного опыта. Они
могут возникать в результате применения
правила, неподходящего для данной
ситуации, или неправильного применения
нужного правила.
Промахи и упущенияявляются, в
основном, обусловленными или
автоматическими реакциями, имеющими
мало общего с сознательным принятием
решений.
С другой стороны, заблуждениясвязаны с принятием преднамеренного
решения и оцениванием ситуации,
основанных на знаниях, опыте и
умственных моделях, хорошо срабатывавших
в прошлом.
Нарушения связаны с заблуждениями.
Хотя промахи, упущения и заблуждения
могут привести к техническим нарушениям
авиационных правил или эксплуатационных
процедур авиакомпании, они рассматриваются
как ошибки, поскольку не основаны
на преднамеренном решении о нарушении
установленных правил. Однако нарушения
не являются ошибками.
Подобно заблуждениям, нарушения включают
преднамеренные нарушения планов, часто
основанные на знаниях и умственных
моделях, приобретенных на основании
ежедневного опыта, но также включают
преднамеренное решение нарушать
установленные правила или
процедуры (например, пилот решает
снизиться ниже предписанного минимума
захода на посадку или диспетчер
уменьшает безопасное расстояние между
воздушными судами ниже установленных
стандартов).
Ошибки, ориентированные на
эксплуатационные условия:
-
процедурная
ошибка— непреднамеренная ошибка,
которая может проявляться в виде
промахов, упущений и заблуждений при
выполнении авиационных правил и/или
установлен- ных процедур авиакомпании.
Намерения верны, но выполнение
ошибочно. Сюда также входят ошибки,
когда летный экипаж забыл что-либо
сделать. При совершении проце- дурных
ошибок всегда наличествуют и записанные
процедуры и намерения экипажа.
-
ошибка
связи— непреднамеренная ошибка в
результате неправильной передачи
или
неверного понимания информации, или
неудачной попытки сообщить нужную
информа- цию другим членам летного
экипажа или обменяться ею между
летным экипажем и внешним адресатом
(например, УВД или наземными службами).
-
ошибка,
связанная с профессиональным уровнем— непреднамеренная ошибка, вызван- ная
недостатком знаний или физических
навыков; -
ошибка в принятии эксплуатационных
решений— непреднамеренная ошибка
при принятии решений, не связанная
напрямую с выполнением авиационных
правил или эксплуатационных процедур
авиакомпании, то есть ошибка, которая
неоправданно наносит ущерб безопасности
полетов (например, решение экипажа
пройти сквозь известную зону сдвига
ветра во время захода на посадку); -
преднамеренное несоблюдение—
намеренное отклонение от авиационных
правил и/или эксплуатационных процедур
авиакомпании. Если экипаж испытывает
повышен- ную рабочую нагрузку или
совершает ошибку только один раз,
это, скорее всего, будет процедурной
ошибкой. Однако если экипаж совершает
одну и ту же ошибку неоднократно, или,
если ошибка вызвана халатностью, тогда
это преднамеренное несоблю- дение (т.е.
нарушение).
Условия, способствующие совершению
ошибок
В модели SHEL неровности границ между
различными блоками модели показывают
несоответствия между человеком и
другими элементами модели. Таким
образом, в каждой зоне интерфейса
модели SHEL существует потенциал
провоцирования или усугубления ошибок.
Например:
-
В
зоне взаимодействия «субъект
(человек) – объект (машина)»неудачно
расположен- ные или неправильно
маркированные кремальеры и ручки могут
вызывать замешатель- ство, ведущее к
промахам. -
В зоне взаимодействия «субъект
(человек) – процедуры» могут
случаться задержки и ошибки во время
поисков жизненно важной информации
в запутанной, недостоверной или
чрезмерно загруженной документации
или картах, что может приводить к
промахам и заблуждениям. -
В зоне взаимодействия «субъект
(человек) – окружающая среда»
факторы окружаю- щей среды или сбои
в биологических ритмах могут влиять
на способность сосредо- тачиваться,
разумно мыслить и общаться, что
влияет на отношение к другим членам
экипажа или к самому выполнению
полета, а все это может способствовать
промахам, упущениям или заблуждениям. -
Неудовлетворительное взаимодействие
«субъект (человек) – субъект
(человек)» может снижать
эксплуатационную эффективность и
вызывать недопонимания, и, в конечном
счете, приводить к промахам, упущениям
и заблуждениям (например, неадекватная
передача информации часто упоминается
в отчетах об авиационных происшествиях
как один из причинных факторов).
Условия, способствующие совершению
нарушений
Условия, способствующие совершению
нарушений, не так хорошо понятны, как
факторы, способствующие совершению
ошибок. Ниже приведены в произвольной
последовательности примеры условий,
способствующих совершению нарушений:
-
конфликтующие между собой цели
(например, предпочтение отдается
своевремен- ности обслуживания или
экономии топлива, а не обеспечению
безопасности полетов); -
давление со стороны руководства
авиакомпании (например, «Если ты не
можешь делать это, то я найму кого-нибудь,
кто сможет»); -
давление, инициируемое внутри самого
себя и со стороны коллег (например,
«Прежний командир воздушного судна
хорошо справлялся с этим, и я смогу»); -
конфликт между командиром ВС и
руководством авиакомпании; -
ненадлежащие надзор и контроль;
-
не отвечающие требованиям нормы
(например, применение опасной практики
коллегами по работе); -
ошибочное восприятие риска;
-
безразличие, проявляемое руководством
(например, молчаливое согласие с тем,
что
отклонения от правил приемлемы);
-
вера в то, что «авиационное происшествие
не может случиться со мной»; -
нечеткие или бессмысленные правила;
-
культура поведения «все могу»,
требующая отклонений от правил.
4.8.2 Обратимые
и необратимые ошибки
Обратимые ошибки, как правило, могут
быть исправлены, а необратимые нет.
Например, если экипаж ошибся в расчете
количества топлива, он может сесть в
ближайшем аэропорту и дозаправиться.
А если по ошибке слил топливо в полете,
то возможности исправления у него может
не оказаться.
Хорошо сконструированная система или
процедура предполагает возможность
исправления ошибок. Так на случай, если
экипаж неправильно распределит топливо
по бакам, что приведет к нарушению
балансировки ВС, должна быть предусмотрена
предупредительная сигнализация.
Непроизвольные движения, пропущенные
действия, ошибочные намерения
Дж. Ризон классифицирует ошибки по
«намерениям»:
-
Предшествовало ли намерение действию?
-
Выполнялись ли действия по плану?
-
Достигли ли они результата?
Непроизвольные движения–
это действия, которые выполняются не
намеренно и не планируются. Например,
дрожание пальцев при установке частоты
на пульте или словесные оговорки.
Пропуски имеют место при
дефиците ресурсов памяти и/или внимания,
когда пилот забывает что-либо сделать.
Например, выпустить шасси.
Ошибочные намерения–
специфический тип ошибок, когда человек
что-либо делает, полагая, что действия
правильные, а фактически – это не так.
Например, выключает не тот двигатель.
Нарушения.
К 4-му типу можно отнести ошибки,
традиционно, называемые нарушениями.
С точки зрения системы нарушения —
результат ошибок профотбора, обучения,
оценки персонала, качества разработки
и внедрения процедур или других системных
недостатков. Нарушения могут быть
следствием стремления лучше выполнить
работу или некомпетентности и лени.
Различают три типа нарушений:
-
Привычные;
-
Ситуативные;
-
Оптимизирующие.
Привычные нарушения – это
нарушения, ставшие повседневной нормой
(в подразделении или авиакомпании),
например, в силу того, что члены экипажа
считают процедуру слишком сложной, и
нарушают ее, чтобы упростить задачу,
сэкономить время.
Ситуативные нарушения —
следствие дефицита времени, высокой
рабочей нагрузки или плохой эргономики
ВС. Такие нарушения люди совершают ради
выполнения задачи (полета).
Оптимизирующие нарушения —
отказ от правил. Порой, не связаны с
задачей. Человек использует возможность
удовлетворить собственные потребности;
напр., делает круг над домом, нарушая
правила.
Дефицит времени и рабочая нагрузка
повышают вероятность нарушений. Люди
сравнивают риск и выгоду спонтанно.
Реальный риск может быть значительно
выше ожидаемого.
Нарушенияотличаются от ошибок
намеренным характером. Т.е., кто-то что-то
делает, зная, что это не по правилам.
Вопрос: должен ли экипаж слепо следовать
стандартным процедурам или отклонения
иногда допустимы, достаточно неоднозначен.
Управление ошибками – это система
действий, направленных на сохранение
контроля над ситуацией, которая
предусматривает комплекс методов
распознавания ошибок, обеспечения
необходимого уровня бдительности и
применение специальных процедур
исправления ошибок.
Управление ошибками – нечто большее,
чем просто стремление предотвращать,
и даже больше, чем стремление исправлять
все ошибки. Эффективный контроль над
ситуацией означает применение таких
стратегий, которые строятся на
представлении, что:
-
не все ошибки приводят к значимым
последствия; -
ошибки носят ненамеренный характер –
никто не планирует ошибаться.
Ошибки– это предупредительные
сигналы, буферная зона между ситуацией,
когда «все под контролем» и когда она
не управляема. Без этих предупредительных
сигналов грань между контролируемым и
не контролируемым состояниями, стала
бы опасно тонкой. Ошибки помогают
учиться, адаптироваться, «держать руку
на пульсе», то есть сохранять над
ситуацией контроль.
Эксперты сохраняют высокий уровень
контроля над ситуацией за счет умения
отделять существенные ошибки от не
существенных. Это умение приходит с
опытом.
Управление ошибками на уровне
экипажа
Заметить ошибку другого человека проще,
чем свою собственную.
Групповые стратегии управления ошибками
включают:
● Коммуникации,
● Правила радиообмена с диспетчером
ОВД,
● Стандартные команды и доклады,
● Стандартные процедуры,
● Перекрестный контроль,
● Брифинг,
● Применение Карт Контрольных Проверок.
Задача управления
ошибками состоит в том, чтобы свести к
минимуму негативные последствия ошибок
при условии, что человеческая ошибка
может произойти в любое время и на любом
этапе полета.
Прежде всего
необходимо выявить ошибку до того
момента, когда она может негативно
сказаться на выполнении полета. Если
же ошибка своевременно не обнаружена
и не предпринято действие по ее
компенсации, ситуация в полете может
значительно усложниться.
Особую опасность
представляют ошибочные действия экипажа
при компенсировании уже допущенной
ошибки. Это может привести к трагическому
финалу.
Способности
человека ограничены. Ошибки возрастают
при увеличении рабочей нагрузки. Ошибки
также происходят при работе со сложными
системами ВС.
Безопасность
полетов это общая и абсолютная ценность
авиации. Главная обязанность всего
персонала развить и поддерживать на
высоком уровне культуру безопасности
в авиакомпании.
Возможности
управления ошибками
а)
Избегание ошибок.
Ошибок
можно избежать, строго выполняя SOP
и научившись
справляться с нестандартными ситуациями
и скрытыми угрозами.
б)
Защита от
ошибок.
Выполнение
стандартных процедур обеспечивает
своевременное обнаружение и исправление
ошибки, прежде чем она усложнит ситуацию.
в)
Уменьшение
последствий ошибки (компенсация).
После
обнаружения ошибки, необходимо
незамедлительно предпринять корректирующие
действия для уменьшения негативных
последствий ошибки.
Ошибки в управлении
Предмет
Языкознание и филология
Разместил
🤓 JolenAndru
👍 Проверено Автор24
разновидность грамматико-синтаксических ошибок, состоящих в выборе формы управляемого слова (существительного, местоимения), не соответствующей нормам синтаксиса.
Научные статьи на тему «Ошибки в управлении»
Следящие и копировальные системы управления
Сигнал ошибки в следящей системе управления представляет собой сигнал, в зависимости от величины и характера…
Статические следящие системы управления управляются значением ошибки: если ошибка имеет место быть, то…
есть управление в системе, чем больше значение ошибки, тем сильнее реакция системы управления….
Следящие системы управления, которые могут автоматически выполнять свои функции при наличии ошибки постоянной…
на выходе с возможно большей точностью, то ошибка, как и в системах программного управления, является
Статья от экспертов
Управление величиной ошибки в нейронных сетях
В статье представлены постановка и решение задачи управления ошибкой искусственной нейронной сети с переменной проводимостью сигнала.
Управление строительным проектом, минимизирующим ошибку агрегирования
Определение 1
Ошибка агрегирования — это разница между результатами исходной и агрегированной задач…
для принятия решений по управлению строительными проектами….
Иными словами, необходимо минимизировать ошибку агрегирования, которая заключается в расхождении между…
с нулевой ошибкой….
Таким образом, управление строительным проектом зачастую требует от команды проекта минимизации ошибки
Статья от экспертов
Управление изменениями: концепции, подходы, ошибки
Тема изменений и реорганизации, безусловно, является актуальной для многих руководителей российских компаний. При этом после того, как необходимые изменения определены, ключевым вопросом становится выбор подхода к управлению изменениями, который в результате приведет к успешной трансформации организации. В статье рассмотрены общие концепции управления изменениями, применение подходов к управлению изменениями для различных типов организаций, методы проведения изменений и типовые ошибки, которые допускают компании.
Повышай знания с онлайн-тренажером от Автор24!
- Напиши термин
- Выбери определение из предложенных или загрузи свое
-
Тренажер от Автор24 поможет тебе выучить термины с помощью удобных и приятных
карточек
ОШИБКИ В УПРАВЛЕНИИ
- ОШИБКИ В УПРАВЛЕНИИ
-
ОШИБКИ В УПРАВЛЕНИИ.
Разновидность синтаксических ошибок, состоящих в выборе формы управляемого слова (существительного, местоимения), не соответствующей синтаксической норме (например, «заведующий кафедры», вместо «заведующий кафедрой»). Данный тип ошибок типичен для изучающих иностранный язык, а в речи носителей языка характерен для детской речи и просторечия; в последнее время все чаще встречается в текстах средств массовой информации и в публичных выступлениях.
Новый словарь методических терминов и понятий (теория и практика обучения языкам). — М.: Издательство ИКАР.
.
2009.
Смотреть что такое «ОШИБКИ В УПРАВЛЕНИИ» в других словарях:
-
ГРАММАТИКО-СИНТАКСИЧЕСКИЕ ОШИБКИ — ГРАММАТИКО СИНТАКСИЧЕСКИЕ ОШИБКИ. Разновидность грамматических ошибок, связанных с нарушениями в построении словосочетаний и предложений. К подобным ошибкам относятся: 1) ошибки в согласовании, 2) ошибки в управлении, 3) ошибки в выборе порядка… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
-
ЦЕНА ОШИБКИ — – значимость ошибок, как для деструктивных, так и для конструктивных процессов, связанных с функционированием человека. Ц. о. соотносится с быстротой обнаружения ошибки, допущенной человеком, возможностью ее устранения и последствиями ошибочного… … Энциклопедический словарь по психологии и педагогике
-
ошибка, -и в управлении — В морфологической и синтаксической стилистике: речевая ошибка, возникающая из за неправильного выбора управляемой формы в словосочетании. Следует различать конструкции со словами, близкими по значению или однокоренными, но требующими различного … Учебный словарь стилистических терминов
-
Точность (в автоматич. управлении) — Точность системы автоматического управления, одна из важнейших характеристик систем автоматического управления (САУ), определяющая степень приближения реального управляемого процесса (УП) к требуемому. Отклонение УП от требуемого вызывается… … Большая советская энциклопедия
-
Психология контроля в управлении — Управление неотделимы от контроля за деятельностью подразделений и отдельных сотрудников и оценки ее результатов. Они выполняют функцию обратной связи, без которой управление существовать не может, обеспечивая получение информации о ходе и… … Энциклопедия современной юридической психологии
-
Контроль в обучении — абитуриент тест, айзенка тест, анализ ошибок, анализ речи компьютером, анализ урока, анкета, анкетирование, баллы оценочные, валидность теста, векслера тест, гиперкоррекция, грамматико морфологические ошибки, грамматико синтаксические ошибки,… … Новый словарь методических терминов и понятий (теория и практика обучения языкам)
-
Авиационная катастрофа — Авиационное происшествие с человеческими жертвами (катастрофа) авиационное происшествие, приведшее к гибели или пропаже без вести одного или более человек, находящихся на борту воздушного судна (пассажиров или членов экипажа). К катастрофам … Википедия
-
Авиакатастрофа — Авиационная катастрофа авиационное происшествие, приведшее к гибели людей обломки самолёта Ту 154,после крушения 4 июля 2001 года а Иркутске Крушение цеппелина Гиндербург,одна из самых знаменитых авиакатастров 20 века Содержание … Википедия
-
Деиндустриализация — (de industrialization) Существенное падение значения обрабатывающей промышленности в экономике промышленно развитой страны, столь глубокое, что экономика этой страны становится неконкурентоспособной в отношении соседних стран. Причинами… … Словарь бизнес-терминов
-
Мишин, Василий Иванович — (р.12.02.1925) спец. в обл. соц. филос. и прикладной социол.; д р филос. наук, проф. Род. в с. Лепня Нижегородской обл. Участник Великой Отеч. войны. Окончил филос. ф т МГУ (1951), асп. там же (1954). С 1954 по 1991 (с перерывом в 1974 1976,… … Большая биографическая энциклопедия
Ошибки — это значения
Время на прочтение
5 мин
Количество просмотров 24K
(Перевод статьи из официального блога Go)
Частой темой среди Go программистов, особенно тех, которые только познакомились с языком, является вопрос о том, как обрабатывать ошибки. Разговор часто сводится к жалобам на то, что последовательность
if err != nil {
return err
}
появляется слишком часто. Недавно мы просканировали все open-source проекты, которые мы только смогли найти и увидели, что этот сниппет появляется лишь раз на страницу или две, гораздо реже, чем многие могли бы подумать. И всё же, если впечатление того, что вы должны всегда писать
if err != nil
остается, значит, очевидно, что-то тут не так, и мишенью оказывается сам Go.
Это неверно, это вводит в заблуждение и это легко исправить. Наверное происходит следующее — программист, знакомясь с Go, задаёт вопрос — «Как я должен обрабатывать ошибки?», заучивает этот паттерн и тут и останавливается. В других языках, это может быть блок try-catch или другой механизм обработки ошибок. Соответственно, думает программист, там где я бы использовал try-catch в моём старом языке, в Go я просто напечатаю if err != nil. Со временем, в Go коде накапливается много таких сниппетов, и результат выглядит неуклюже.
Но вне зависимости от того, как это объясняется на самом деле, очевиден тот факт, что эти Go программисты упускают фундаментальную идею ошибок: Ошибки это значения.
Значениями можно оперировать и программировать различную логику, и поскольку ошибки это значения, то и ошибками также можно оперировать и программировать логику.
Конечно, самой частой операцией с ошибкой-значением будет проверка, является она нулевой или нет, но есть бесчисленное количество других вещей, которые можно делать со значением, и применение многих из них может сделать вашу программу лучше, убрав большую часть boilerplate, которая появляется, если каждую ошибку проверять, без раздумий, через if.
Вот простой пример из пакета bufio, тип Scanner. В нём метод Scan осуществляет низлежащие операции ввода-вывода, которые, разумеется, могут вернуть ошибку. Но при этом, метод Scan, не возвращает ошибку вообще. Взамен, он возвращает boolean, и отдельный метод, который может быть запущен в конце процесса сканирования, сообщая, произошла ли ошибка. Пользовательский код выглядит примерно так:
scanner := bufio.NewScanner(input)
for scanner.Scan() {
token := scanner.Text()
// process token
}
if err := scanner.Err(); err != nil {
// process the error
}
Безусловно, тут есть проверка ошибки на nil, но она происходит и выполняется лишь раз. При этом, метод Scan мог бы быть определён как
func (s *Scanner) Scan() (token []byte, error)
и пользовательский код мог выглядеть как-нибудь так (в зависимости от того, как извлекается токен),
scanner := bufio.NewScanner(input)
for {
token, err := scanner.Scan()
if err != nil {
return err // or maybe break
}
// process token
}
Эти подходы не сильно отличается, но тут есть одно важное отличие. В этом коде, пользователь должен проверять ошибку на каждой итерации, но в самом API сканера, обработка ошибок происходит на другом уровне абстракций — ключевой элемент API работает с токенами. В существующем же дизайне API, пользовательский код таким образом выглядит более естественным: сначала пройтись до конца по токенам, а потом проверять и волноваться об ошибках. Обработка ошибок не прячет поток управления.
Под капотом всего этого, конечно, происходит следующее — как только Scan обнаруживает ошибку ввода-вывода, она сохраняет ошибку и возвращает false. Отдельный метод, Err, её возвращает, когда клиент запросит. Тривиально, но это не тоже самое, что вставлять
if err != nil
во все места или просить клиента проверять ошибку на каждый токен. Это программирование с использованием значений ошибок. Простое программирование, да, но всё же программирование.
Важно отметить, что какой бы ни был дизайн, очень критично, чтобы программа проверяла ошибки и чтобы ошибки были доступны. Обсуждение тут не о том, как избежать проверки ошибок, а о том, как использовать язык, чтобы обрабатывать ошибки красиво.
Тема повторяющегося кода для обработки ошибок поднялась, когда я был на конференции GoCon осенью 2014 в Токио. Гофер-энтузиаст, под ником @jxck_ в Твиттере, повторил частую жалобу про проверку ошибок. У него был некоторый код, который схематически выглядит примерно так:
_, err = fd.Write(p0[a:b])
if err != nil {
return err
}
_, err = fd.Write(p1[c:d])
if err != nil {
return err
}
_, err = fd.Write(p2[e:f])
if err != nil {
return err
}
// and so on
Это слишком повторяющийся код. В реальном примере, который был длиннее, было ещё масса кода и было непросто просто так отрефакторить этот код, создав функцию-хелпер, но в общем случае, литерал функции, замыкающую в себе обработку ошибки мог бы помочь:
var err error
write := func(buf []byte) {
if err != nil {
return
}
_, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
return err
}
Этот паттерн работает хорошо, но требует замыкание в каждой функции, которая должна делать запись, а отдельная внешняя функция для этого будет неуклюжей, поскольку переменная err должна переиспользоваться между вызовами (попробуйте).
Мы можем сделать этот код более ясным, более общим и переиспользуемым, если позаимствуем идею из метода Scan, которую обсуждали выше. Я упомянул эту технику в нашем разговоре, но @jcxk_ не понял, как её применить. После длинной беседы, несколько стесненной языковым барьером, я спросил, могу ли я просто взять его ноутбук и показать пример, написав реальный код.
Я определил объект под названием errWriter, примерно вот так:
type errWriter struct {
w io.Writer
err error
}
и дал ему один метод, write. Он не должен даже следовать стандартной Write сигнатуре, и он намеренно с маленькой буквы, чтобы подчеркнуть отличие. Метод write вызывает Write метод низлежащего Writer-а и сохраняет ошибку для использования в будущем:
func (ew *errWriter) write(buf []byte) {
if ew.err != nil {
return
}
_, ew.err = ew.w.Write(buf)
}
Как только ошибка произойдёт, метод write станет no-op, но значение ошибки будет сохранено.
Имея тип errWriter и его метод write, мы можем переписать код выше:
ew := &errWriter{w: fd}
ew.write(p0[a:b])
ew.write(p1[c:d])
ew.write(p2[e:f])
// and so on
if ew.err != nil {
return ew.err
}
Это намного яснее, даже по сравнению с использованием замыканий, и делает фактическую последовательность записей более удобной в представлении. Больше нет беспорядка. Программирование со значениями ошибок (и интерфейсами) сделало код приятней.
Вполне вероятно, что и другой кусок кода в этом же пакете может быть построен на этой идее, или даже использовать errWriter напрямую.
Помимо прочего, как только errWriter завершает работу, он может делать дополнительные полезные вещи, особенно в менее искусственных примерах. Он может накапливать количество байт, к примеру. Он может объединять запросы на запись в один буфер, который затем будет записан атомарно. И многое другое.
По факту, этот паттерн появляется в стандартной библиотеке весьма часто. Пакеты archive/zip и net/http его используют. Более релевантный к этой дискуссии, Writer в пакете bufio является, по сути, реализацией идеи errWriter. Хотя bufio.Writer.Write возвращает ошибку, это, в основном, для имплементации интерфейса io.Writer. Метод Write в bufio.Writer ведёт себя также, как и errWriter.write в примере выше, и вызывает Flush в момент возврата ошибки, так что наш пример мог бы был записан следующим образом:
b := bufio.NewWriter(fd)
b.Write(p0[a:b])
b.Write(p1[c:d])
b.Write(p2[e:f])
// and so on
if b.Flush() != nil {
return b.Flush()
}
В таком подходе, впрочем, есть один значительный минус, по крайней мере, для некоторых применений: нет способа узнать, как много данных было обработано до возникновения ошибки. Если эта информация важна, нужен будет более адаптированный подход. Но зачастую, подход всё-или-ничего в конце бывает достаточным.
Мы посмотрели лишь на одну из техник избегания повторяющегося кода проверки ошибок. Имейте ввиду, что использование errWriter или bufio.Writer — не единственный способ упростить обработку ошибок, и этот подход не подходит ко всем случаям. Ключевой урок тут в том, что ошибки — это значения, и вся мощь Go как языка программирования в вашем распоряжении чтобы их обрабатывать.
Используйте язык для того, чтобы упростить обработку ошибок.
Но помните: Чтобы вы ни делали, всегда проверяйте ошибки!
И в заключение, для полноты картины моего общения с @jxck_, включая небольшое записанное им видео, посмотрите его блог.