power query комментарии в коде
Power Query: стероиды для MS Excel и Power BI
В данной статье я хочу рассказать о некоторых возможностях бесплатной и крайне полезной, но пока еще мало известной надстройки над MS Excel под названием Power Query.
Power Query позволяет забирать данные из самых разных источников (таких как csv, xls, json, текстовых файлов, папок с этими файлами, самых разных баз данных, различных api вроде Facebook opengraph, Google Analytics, Яндекс.Метрика, CallTouch и много чего еще), создавать повторяемые последовательности обработки этих данных и загружать их внутрь таблиц Excel или самого data model.
И вот под катом вы можете найти подробности всего этого великолепия возможностей.
Совместимость и технические подробности
Power Query доступен бесплатно для всех версий Windows Excel 2010, 2013 и встроен по умолчанию в Windows Excel 2016. Для пользователей MacOS X Power Query недоступен (впрочем, даже без этого маковский Excel отвратителен на ощупь и продвинутые пользователи, включая меня, чаще всего работают с нормальным Excel через Parallels или запуская его на удаленной виндовой машинке).
Также, Power Query встроен в новый продукт для бизнес аналитики — Power BI, а еще, ходят слухи, что Power Query будет появляться и в составе других продуктов от Microsoft. Т.е. Power Query ждет светлое будущее и самое время для адептов технологий Microsoft (и не только) заняться его освоением.
Как оно работает
После установки Power Query в интерфейсе Excel 2010–2013 появляется отдельная одноименная вкладка.
В новом Excel 2016 функционал Power Query доступен на вкладке Data (данные), в блоке “Get & Transform”.
Сначала, в интерфейсе Excel мы выбираем конкретный источник данных, откуда нам их нужно получить, и перед нами открывается окошко самого Power Query с предпросмотром первых строчек загруженных данных (область 1). В верхней части окошка располагается Ribbon с командами по обработке данных (область 2). И в правой части экрана (область 3) у нас расположена панель с последовательностью всех действий, которые применяются к данным.
Возможности Power Query
У Power Query очень много возможностей и я хочу остановиться на некоторых из числа моих любимых.
Как я уже писал выше, Power Query замечателен тем, что позволяет подключаться к самым разным источникам данных. Так он позволяет загружать данные из CSV, TXT, XML, json файлов. Притом процесс выбора опций загрузки тех-же CSV файлов гибче и удобнее, чем он реализован штатными средствами Excel: кодировка автоматически выбирается часто правильно и можно указать символ разделителя столбцов.
Объединение файлов лежащих в папке
Power Query умеет забирать данные из указанной папки и объединять их содержимое в единые таблицы. Это может быть полезно, например, если вам периодически приходят какие-то специализированные отчеты за отдельный промежуток времени, но данные для анализа нужны в общей таблице. Гифка
Текстовые функции
Числовые функции
К столбцам с числовыми значениями по нажатию на кнопки на Ribbon можно применять:
Функции для работы с датами, временем и продолжительностью
К столбцам со значениями даты и времени по нажатию на кнопки на Ribbon можно применять:
Unpivot — Pivot
В интерфейсе Power Query есть функция “Unpivot”, которая в один клик позволяет привести данные с одной метрикой разложенные по столбцам по периодам к форме, которая будет удобна для использования в сводных таблицах (понимаю что трудно написал — смотрите пример). Также, есть функция с обратным действие Pivot. Гифка
Функция ВПР (VLOOKUP) одна из наиболее используемых функций в MS Excel. Она позволяет подтягивать данные в одну таблицу из другой таблицы по единому ключу. И вот как раз для этой функции в Power Query есть гораздо более удобная альтернатива — операция Merge. При помощи этой операции соединение таблиц нескольких таблиц в одну по ключу (по простому или по составному ключу, когда соответствие нужно находить по нескольким столбцам) выполняется буквально в 7 кликов мыши без ввода с клавиатуры.
Операция Merge — это аналог join в sql, и ее можно настроить чтобы join был разных типов — Inner (default), Left Outer, Right Outer, Full Outer.
Upd.Мне тут подсказали, что Power Query не умеет делать Aproximate join, а впр умеет. Чистая правда, из коробки альтернатив нет. Гифка
Подключение к различным базам данных. Query Folding.
Power Query также замечателен тем, что умеет цепляться к самым разным базам данных — от MS SQL и MySQL до Postgres и HP Vertica. При этом, вам даже не нужно знать SQL или другой язык базы данных, т.к. предпросмотр данных отображается в интерфейсе Power Query и все те операции, которые выполняются в интерфейсе прозрачно транслируются в язык запросов к базе данных.
А еще в Power Query есть понятие Query Folding: если вы подключены к совместимой базе данных (на текущий момент это MS SQl), то тяжелые операции по обработке данных Power Query будет стараться выполнить на серверной стороне и забирать к себе лишь обработанные данные. Эта возможность радикально улучшает быстродействие многих обработок.
Язык программирования “М”
Надстройка Power Query — это интерпретатор нового, скриптового, специализированного для работы с данными, языка программирования М.
На каждое действие, которое мы выполняем с данными в графическом интерфейсе Power Query, в скрипт у нас пишется новая строчка кода. Отражая это, в панели с последовательностью действий (область 3), создается новый шаг с говорящим названием. Благодаря этому, используя панель с последовательностью действий, мы всегда можем посмотреть как выглядят у нас данные на каждом шаге обработки, можем добавить новые шаги, изменить настройки применяемой операции на конкретном шаге, поменять их порядок или удалить ненужные шаги. Гифка
Также, мы всегда можем посмотреть и отредактировать сам код написанного скрипта. И выглядеть будет он примерно так:
Язык M, к сожалению, не похож ни на язык формул в Excel, ни на MDX и, к счастью, не похож на Visual Basic. Однако, он очень прост в изучении и открывает огромные возможности по манипуляции данными, которые недоступны с использованием графического интерфейса.
Загрузка данных из Яндекс.Метрики, Google Analytics и прочих Api
Немного овладев языком “M” я смог написать программки в Power Query, которые умеют подключаться к API Яндекс.Метрики и Google Analytics и забирать оттуда данные с задаваемыми настройками. Программки PQYandexMetrika и PQGoogleAnalytics я выложил в опенсорс на гитхаб под лицензией GPL. Призываю пользоваться. И я буду очень рад, если эти программы будут дорабатываться энтузиастами.
Для Google Analytics подобного рода экспортеров в разных реализациях достаточно много, но вот для Яндекс.Метрики, насколько я знаю, мой экспортер был первым публично доступным, да еще и бесплатным 🙂
Power Query умеет формировать headers для post и get запросов и забирать данные из интернета. Благодаря этому, при должном уровне сноровки, Power Query можно подключить практически к любым API. В частности, я для своих исследований дергаю данные по телефонным звонкам клиентов из CallTouch API, из API сервиса по мониторингу активности за компьютером Rescuetime, занимаюсь парсингом нужных мне веб-страничек на предмет извлечения актуальной информации.
Еще раз про повторяемость и про варианты применения
Как я уже писал выше, скрипт Power Query представляет собой повторяемую последовательность манипуляций, применяемых к данным. Это значит, что однажды настроив нужную вам обработку вы сможете применить ее к новым файлам изменив всего один шаг в скрипте — указав путь к новому файлу. Благодаря этому можно избавиться от огромного количества рутины и освободить время для продуктивной работы — анализа данных.
Я занимаюсь веб-аналитикой и контекстной рекламой. И так уж получилось, что с момента, как я познакомился с Power Query в ее интерфейсах я провожу больше времени, чем в самом Excel. Мне так удобнее. Вместе с тем возросло и мое потребление другой замечательной надстройки в MS Excel — PowerPivot.
Вот bi систему, про которую я рассказывал на Yac/M 2015 (видео) я делал полнстью при помощи Power Query и загружал данные внутрь PowerPivot.
Пару слов про локализацию
На сайте Microsoft для пользователей из России по умолчанию скачивается Power Query с переведенным на русским язык интерфейсом. К счастью, локализаторы до перевода на русский языка программирования (как это сделано с языком формул в excel) не добрались, однако жизнь пользователям неоднозначными переводами сильно усложнили. И я призываю вас скачивать, устанавливать и пользоваться английской версией Power Query. Поверьте, она будет гораздо понятнее.
Power Query: как перестать бояться функционального программирования и начать работать в расширенном редакторе запросов
Не так давно наткнулся на статью на Хабре о том, как пользоваться Power BI и как проводить с помощью него Простой план-фактный анализ. Автору огромный респект за труд — материал, действительно, полезный. Более чем достаточно для начинающего. Однако, насколько я понял, для многих работа с PQ/PBI так и заканчивается нажатием на кнопочки в интерфейсе.
В принципе, большинству пользователей этого вполне достаточно для решения несложных задач. Тем более, что это самое большинство, что называется, в быту — непрограммистывообщениразу. Да и, как показала практика, далеко не все знают, что в PQ есть режим расширенного редактирования запросов. А между тем, боязнь (нежелание/неумение) копнуть глубже лишает возможности задействовать весь заложенный функционал PQ/PBI в полной мере. Отмечу хотя бы тот факт, что в интерфейсе присутствуют далеко не все кнопочки, для которых есть функции. Думаю, не сильно ошибусь, если скажу, что функций, пожалуй, раза в два больше, чем кнопок.
Если же вы чувствуете, что для решения имеющихся задач вам недостаточно отведённого в интерфейсе функционала и/или есть время удовлетворить академический интерес, добро пожаловать под кат…
Преамбула
Листая статью, я наткнулся на фрагмент, где автор предлагает создать таблицу соответствия месяца года его порядковому номеру, ссылаясь на то, что «язык «М» не позволяет на текущий момент конвертировать названия месяцев в даты».
В принципе, задачка элементарная. Но посмотрев на то, каким запросом она была реализована, понял, что просто так пройти мимо я уже не смогу.
Что делает автор, если переводить код на русский язык
Критика
Дисклеймер. Сразу оговорюсь, претензий к автору и к его подходам составлять скрипты у меня нет (возможно, скрипты писались на скорую руку). Цель данной статьи — показать начинающим различные подходы при составлении скриптов.
Замечание. Если хотите поглубже разобраться, как работает та или иная функция на одном из этапов, удалите скобки с параметрами — и вы увидите к ней документацию с описанием того, что она принимает и что отдаёт
Итак, что меня сходу возсмутило:
Список месяцев набирается вручную
Во-первых, как уже было отмечено выше, набирая текст, можно легко ошибиться, во-вторых, все эти кавычки/запятые… Ну их — только путаница. Поэтому, вместо того, чтобы создавать список, перечисляя месяцы, я бы предложил использовать обычную текстовую строку с естественным разделителем. Т.е. запятую.
Здесь, вроде бы, всё понятно — функция Text.Split преобразует строку в список, разбивая её разделителем «, «
Начинать индекс можно с любого числа, в том числе с единицы (если прочитать документацию)
Более того, в функции Table.AddIndexColumn последним аргументом можно задать шаг, отличный от единицы. Соответственно, можно пронумеровать ячейки и так — 15,20,25,30…
С этого, собственно, всё и началось…
Во что переросла критика
Далее я приведу примеры кода с комментариями с постепенно нарастающей сложностью. Начну с того, каким образом можно нагенерить список месяцев.
Самое простое — непосредственное перечисление, используя синтаксис языка М:
Чуть посложнее — разбивая строку на части разделителем:
Используя функцию генерации списка дат:
Здесь на первом шаге функция List.Dates генерирует список дат, принимая первым аргументом стартовую дату, вторым количество элементов, а третьим — шаг инкрементирования. В данном случае, добавляя 32 дня к месяцу, мы с каждым шагом гарантированно попадём в следующий месяц. Конечно же, будь в календаре 13 и более месяцев, такой приём бы не прокатил. Но для учебных целей вполне сойдёт.
Второй шаг — преобразование списка дат в список названий месяцев. Изучив документацию, мы находим, что за преобразование даты в месяц отвечает функция Date.MonthName. Что она делает — берет первым аргументом дату и отдаёт название месяца в виде строки. А если мы третьим пунктом передадим и необязательный аргумент culture («ru-RU», «en-US», «uk-UA», «ar-LY»), то получим название месяца с учетом локали. Ок, тогда, соответственно, нам надо применить эту функцию к каждому элементу списка.
Теперь нам нужен инструмент, который занимается преобразованием списков. За преобразование списков отвечает функция List.Transform. Что она делает — она берёт первым аргументом входной список и применяет к каждому элементу функцию, которая передаётся вторым аргументом.
Ок, говорим мы, и отправляем вторым аргументом Date.MonthName. Далее следует пояснить, что происходит — функция List.Transform берет каждый элемент массива и скармливает его функции Date.MonthName, передавая ей каждую Дату в качестве аргумента неявным образом.
Хорошо, а если мы хотим получить названия месяцев с учетом локали? Скажем, «uk-UA». Как нам задать этот параметр? Как мы помним, List.Transform принимает вторым аргументом _функцию_ (и только функцию), и мы не можем явно передать этой функции ни первый аргумент, ни тем более второй. Соответственно, нам нужна функция, принимающая, как в документации, один параметр. А давайте ее создадим! Назовём её просто «fn», сделаем в ней всё, что необходимо, и отдадим её List.Transform’у. В javascript’е это называется «замыканием»:
Тогда наш код будет выглядеть так:
Вообще, задавать какое-то имя функции не обязательно. Можно вписать безымянную функцию прямо в скобках:
А ещё мы помним, что в исходном списке месяцы были записаны с маленькой буквы. Сделаем это всё в той же самой функции:
А давайте теперь попробуем сформировать список месяцев несколько другим способом — используя функцию List.Generate. В документации сказано следующее:
Т.е. все три аргумента — функции. Отлично! Тогда задача сводится всего лишь к одной строке:
Ну хорошо, пусть будет несколько, для наглядности:
Что здесь происходит. Вычисляется функция инициализации стартового значения, заданная первым аргументом. Это дата «1 января 2016». Далее вычисляется функция, заданная вторым аргументом, которой _неявно_ передаётся значение (x), вычисленное на предыдущем шаге. Эта вторая функция выполняет простую задачу — возвращает true/false, что означает, можно ли дальше продолжать вычисления. В нашем случае «1 января 2016»
Краткий обзор языка формул Power Query M
В этом кратком обзоре описывается создание запросов на языке формул Power Query M.
M — это язык с учетом регистра.
Создание запроса с помощью редактора запросов
Для создания расширенного запроса используется редактор запросов. Комбинированный запрос состоит из переменных, выражений и значений, инкапсулированных в выражении let. Переменная может содержать пробелы. Для этого нужно указать идентификатор # и имя в кавычках, например #»Имя переменной».
Выражение let имеет следующую структуру:
Чтобы создать запрос M в редакторе запросов, необходимо выполнить указанную ниже последовательность действий.
Создайте последовательность шагов для формулы запроса, которая начинается с инструкции let. Каждый шаг определяется именем переменной шага. Переменная в M может содержать пробелы, но для этого необходимо использовать символ #, например как в #»Имя шага». Шаг формулы может быть пользовательской формулой. Обратите внимание, что в языке формул Power Query учитывается регистр.
Каждый шаг формулы запроса основан на предыдущем, на который он ссылается по имени переменной.
Выведите шаг формулы запроса с помощью инструкции in. Как правило, в качестве результирующего набора данных используется последний шаг запроса.
Дополнительные сведения о выражениях и значениях см. в статье Выражения, значения и выражение let.
Простые шаги формулы Power Query M
Предположим, что вы создали приведенное ниже преобразование в редакторе запросов для преобразования названий продуктов в надлежащий регистр.
Вы получили таблицу, которая выглядит так:
OrderID | CustomerID | Элемент | Цена |
---|---|---|---|
1 | 1 | удочка | 100 |
2 | 1 | Черви, 1 фунт | 5 |
3 | 2 | рыболовная сеть | 25 |
Вы хотите изменить первую букву в каждом слове в столбце Item на прописную, чтобы получить следующую таблицу:
OrderID | CustomerID | Элемент | Цена |
---|---|---|---|
1 | 1 | Удочка | 100 |
2 | 1 | Черви, Вирусы-черви | 5 |
3 | 2 | Рыболовная сеть | 25 |
Шаги формулы M для преобразования исходной таблицы в результирующую выглядят следующим образом:
Вот код, который можно вставить в редактор запросов:
Давайте рассмотрим каждый шаг формулы.
Orders — создает таблицу [Table](#_Table_value) с данными из таблицы Orders.
#«Capitalized Each Word» — для изменения первой буквы в каждом слове на прописную используется Table.TransformColumns().
in #»Capitalized Each Word» — выводит таблицу, в которой каждое слово начинается с прописной буквы.
Введение
Обзор
Microsoft Power Query предоставляет эффективный интерфейс получения данных, обладающий множеством возможностей. К ключевым возможностям Power Query относятся фильтрация и объединение данных, позволяющие комбинировать данные из одного или нескольких поддерживаемых источников данных из обширной коллекции. Для выражения всех подобных комбинаций данных используется язык формул Power Query (формально известный как язык M). Power Query внедряет документы M в книги Excel и Power BI, чтобы обеспечить повторяемое объединение данных.
В этом документе содержится спецификация для M. После краткого введения, цель которого предоставить ознакомительные сведения о языке, в документе подробно рассматривается язык в нескольких последовательных шагах:
Лексическая структура определяет набор текстов, которые являются лексически допустимыми.
Значения, выражения, среды и переменные, идентификаторы и модель оценки, которые образуют основные понятия языка.
Подробное описание значений, как примитивов, так и структурированных данных, определяет целевое назначение языка.
Значения имеют типы, которые сами по себе являются особым видом значений. Оба они характеризуют фундаментальные типы значений и содержат дополнительные метаданные, относящиеся к формам структурированных значений.
Набор операторов в языке M определяет, какие типы выражений могут быть сформированы.
Функции, другая разновидность специальных значений, предоставляют основу для обширной стандартной библиотеки для языка M и позволяют добавлять новые абстракции.
Ошибки могут возникать при применении операторов или функций во время вычисления выражения. Несмотря на то что ошибки не являются значениями, существуют способы обработки ошибок, с помощью которых ошибки можно сопоставить обратно со значениями.
Выражения let позволяют создавать дополнительные определения, используемые для построения сложных выражений в несколько небольших шагов.
Выражения if поддерживают условную оценку.
Разделы обеспечивают простой механизм модульности. (Разделы пока еще не используются Power Query.)
Наконец, консолидированная грамматика объединяет в себе фрагменты грамматики из других разделов этого документа в одно полное определение.
Для теоретиков компьютерных языков: язык формул, описываемый в этом документе, является по большей части чистым, динамически типизированным, частично функционально упрощенным языком высшего порядка.
Выражения и значения
Основной компонент в языке M — это выражение. Выражение можно вычислить, возвратив одно значение.
Хотя многие значения могут быть записаны буквально в виде выражения, значение не является выражением. Например, вычисление выражения 1 дает значение 1, а вычисление выражений 1+1 дает значение 2. Это неочевидное, но важное различие. Выражения являются наборами правил для вычисления, а значения — результатами вычисления.
В следующих примерах показаны различные виды значений, доступные в M. По соглашению значение записывается в литеральной форме, в которой они будут отображаться в выражении, результатом которого является только это значение. (Обратите внимание, что // указывает начало комментария, который продолжается до конца строки.)
Примитив — это однокомпонентное значение, например число, логическое значение, текст или значение NULL. Значение NULL может использоваться для указания отсутствия каких-либо данных.
Значение списка является упорядоченной последовательностью значений. M поддерживает бесконечные списки, но в случае написания в виде литерала списки имеют фиксированную длину. Символы фигурных скобок ( < и >) обозначают начало и конец списка.
Таблица — это набор значений, упорядоченных по столбцам (идентифицируемые по имени) и строкам. Для создания таблицы не предусмотрен литеральный синтаксис, однако существует несколько стандартных функций, которые можно использовать для создания таблиц из списков или записей.
Данный код создает таблицу следующей формы:
Оценка
Модель оценки языка M базируется на модели оценки, часто применяемой в электронных таблицах, где порядок вычислений можно определить на основе зависимостей между формулами в ячейках.
Если вы ввели формулы в электронных таблицах, например в Excel, можно определить, что при вычислении указанные слева формулы дадут значения, указанные справа:
В языке M части выражения могут ссылаться на другие части выражения по имени, и процесс оценки автоматически определит порядок вычисления выражений, на которые имеются ссылки.
Можно использовать запись для создания выражения, эквивалентного приведенному выше примеру электронной таблицы. При инициализации значения поля мы можем сослаться на другие поля в записи по имени поля, как показано ниже:
Приведенное выше выражение эквивалентно следующему (в той части, что оба вычисляют равные значения):
Приведенное выше выражение эквивалентно следующему при вычислении:
Записи также могут содержаться в списках. Чтобы обратиться к элементу списка по его числовому индексу, используйте позиционный оператор индекса ( <> ). Для ссылки на значения в списке используется начинающийся с нуля индекс, отсчитываемый от начала списка. Например, индексы 0 и 1 используются для ссылки на первый и второй элементы в списке ниже:
Выражения элементов списка и записи (а также выражения let, представленные ниже) оцениваются с помощью отложенных вычислений, что означает, что они оцениваются только по мере необходимости. Все остальные выражения оцениваются с помощью безотложного вычисления, то есть сразу же при их обнаружении в процессе оценки. При этом следует помнить, что оценка выражения записи или списка возвратит значение записи или списка, которое помнит соответствующе поля записи или элементы списка, которые требуется вычислить при необходимости (с помощью операторов индекса или подстановки).
Функции
В языке M функция — это сопоставление набора входных значений с одним выходным значением. Функция записывается путем именования требуемого набора входных значений (параметров функции) и последующего предоставления выражения, которое будет вычислять результат функции с использованием этих входных значений (основная часть функции) после символа перехода ( => ). Пример:
Функция — это значение, аналогичное числу или текстовому значению. В следующем примере показана функция, являющаяся значением поля «Add», которая затем вызывается или выполняется из нескольких других полей. При вызове функции указывается набор значений, которые логически подставляются для требуемого набора входных значений в выражении тела функции.
Библиотека
Язык M включает общий набор определений, доступных для использования в выражении, который именуется стандартной библиотекой или просто библиотекой для краткости. Эти определения состоят из набора именованных значений. Имена значений, предоставленных в библиотеке, можно использовать в выражении без необходимости определять их явным образом в выражении. Пример:
Операторы
Язык M включает набор операторов, которые можно использовать в выражениях. Операторы применяются к операндам для формирования символьных выражений. Например, в выражении 1 + 2 числа 1 и 2 являются операндами, а оператор представлен оператором сложения ( + ).
Значение оператора может меняться в зависимости от типа значений операндов. Например, оператор сложения можно использовать с другими видами значений, отличными от чисел:
Еще один пример оператора с операндом в зависимости от значения — оператор комбинирования ( & ):
Обратите внимание, что оператор может поддерживать не все сочетания значений. Пример:
Выражения, при вычислении которых возникают неопределенные условия оператора, обрабатываются как ошибки. Дополнительные сведения об ошибках в языке М представлены ниже.
Метаданные
Метаданные — это сведения о значении, которое связано со значением. Метаданные представлены в виде значения записи, которое называется записью метаданных. Поля записи метаданных можно использовать для хранения метаданных значения.
Каждое значение имеет запись метаданных. Если значение записи метаданных не указано, то запись метаданных пуста (не содержит поля).
Записи метаданных предоставляют способ связать дополнительную информацию с любым видом значения ненавязчивым способом. Связывание записи метаданных со значением не приводит к изменению значения или его поведения.
Для значений, которые уже содержат непустую запись метаданных, результат применения мета заключается в вычислении слияния записей существующей и новой записей метаданных. Например, следующие два выражения эквивалентны друг другу и предыдущему выражению:
Выражение let
Многие из приведенных выше примеров содержат в результате выражения все литеральные значения выражения. Выражение let позволяет вычислить, снабдить именами набор значений, а затем использовать их в последующем выражении, которое следует за оператором in. Например, в нашем примере данных о продажах можно сделать следующее:
Выражение if
Выражение if осуществляет выбор между двумя выражениями на основе логического условия. Пример:
Первое выражение ( 2 + 2 ) выбирается, если логическое выражение ( 2 > 1 ) истинно, а второе выражение ( 1 + 1 ) выбирается, если оно ложно. Выбранное выражение (в данном случае 2 + 2 ) вычисляется и становится результатом выражения if ( 4 ).
ошибки
Ошибка в языке M означает, что при вычислении выражения не удалось получить значение.
Ошибки выдаются операторами и функциями, сталкивающимися с условиями ошибки, либо с помощью выражения error. Ошибки обрабатываются с помощью выражения try. При возникновении ошибки указывается значение, которое можно использовать для указания причины возникновения ошибки.
Приведенный выше пример обращается к полю Sales[UnitPrice] и форматирует значение, формирующее результат:
Выражение try преобразует надлежащие значения и ошибки в значение записи, которое указывает, обрабатывало ли выражение try ошибку или нет, и правильное значение либо запись об ошибке, извлеченные при обработке ошибки. Например, рассмотрим следующее выражение, которое вызывает ошибку и затем сразу же обрабатывает ее:
Распространена замена ошибок значениями по умолчанию. Чтобы добиться того же, но в компактной форме, можно использовать выражение try с необязательным предложением otherwise :