Найти в Дзене

Обработка встроенных ошибок и предупреждений в плагине для Revit

Оглавление

Довольно часто при работе в Ревите мы сталкиваемся с ошибками и предупреждениями. Это те самые окна, которые всплывают в левом нижнем углу или по центру экрана. Предупреждение можно пропустить, а ошибка мешает работе — как правило, приходится отменять действия и переделывать всё заново (хотя в некоторых случаях можно нажать, например, "Отсоединить элементы").

Пример ошибки, требующей действий от пользователя
Пример ошибки, требующей действий от пользователя

Большая проблема ошибок и предупреждений в том, что нельзя просто так взять и отловить их с помощью try-catch. Дело в том, что при таких ошибках исключений не возникает — возникают экземпляры класса BuiltInFailures. И сами по себе они не исчезнут: иногда их надо прощёлкивать руками, особенно если они возникают в цикле.

Однако, иногда избежать таких ошибок при выполнении плагина невозможно. То есть нам надо их обрабатывать. И RevitAPI предоставляет нам такую возможность: интерфейс IFailurePreprocessor.

Пропуск предупреждений

Реализуем этот интерфейс в режиме пропуска предупреждений:

-2

Что тут происходит:

  • Мы имеем FailureAccessor из сигнатуры метода.
  • Из него мы получаем сообщения об ошибках.
  • Проверяем тип сообщения, и, если это предупреждение, удаляем его.
  • Возвращаем FailureProcessingResult.

Обработка ошибок

Создадим ещё одну реализацию IFailurePreprocessor, которая будет отлавливать ошибки, где есть решение "Отсоединить элементы", и применять это решение автоматически:

-3

На 17 строке мы проверяем, что такое решение есть.

  • На 19 строке назначаем его как текущее.
  • На строке 24 мы выбираем метод ResolveFailure (вместо DeleteWarning).
  • И затем возвращаем ProceedWithCommit.

Подключение обработчика ошибок к плагину

Сам по себе обработчик ошибок нам не поможет, его нужно подключить к транзакции. Как это сделать:

Код занимает всего 3 строки, но чтобы не воспроизводить его каждый раз, я вынес его в отдельный статический класс:

-4

Далее просто в коде сразу после начала транзакции вызовите этот статический метод и передайте ему эту транзакцию. Готово!

Заключение

Поскольку в ранее написанных в этом блоге плагинах вероятность такой ошибки при выполнении маловероятна, я просто написал эти классы и выложил код в свой репозиторий на GitHub, но не подключал их к транзакциям.

Скорее всего, в своих плагинах вы не сможете использовать всё это в чистом виде, но сможете легко сделать всё по аналогии, применяя методы отладки в случае проблем.

А на этом всё на сегодня. Не забывайте ставить лайки здесь и звёздочки на GitHub, а так же подписывайтесь на мой телеграм-канал о Revit API. До новых встреч!

-5