Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 58 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
- прикреплять к ошибкам структурированные диагностические данные;
- находить нужные ошибки и группы ошибок во всей цепочке причин;
- формировать пользовательское и диагностическое представления;
- проверять контракты аргументов с помощью стандартных структурированных ошибок.
- проверять контракты аргументов с помощью стандартных структурированных ошибок;
- классифицировать неструктурированные исключения по декларативным правилам.

## Навигация

Expand All @@ -38,7 +39,7 @@

Установите пакет из OPM:

```console
```shell
opm install errors
```

Expand Down Expand Up @@ -130,6 +131,56 @@ config.invalid_port: Некорректное значение порта
Полный каталог фабрик и рекомендации по выбору близких кодов приведены в
[руководстве по стандартным ошибкам](docs/СтандартныеОшибки.md).

### Классифицировать неструктурированную ошибку

Декларативные правила присваивают стабильный код сообщениям внешних исключений.
Например, путь файла меняется, но тип ошибки, начало и окончание её сообщения остаются
постоянными:

```bsl
Правила = Новый Массив;
Правила.Добавить(
Новый ПравилоКлассификацииОшибок
.СНативнымТипом("System.IO.IOException")
.НачинаетсяС("ru = 'Файл '''; en = 'The file '''")
.ОканчиваетсяНа("ru = ''' уже существует.'; en = ''' already exists.'")
.СИдентификатором("filesystem.already_exists.file_path")
.КлассифицируетКак(
"filesystem.already_exists",
"ru = 'Файл уже существует'; en = 'File already exists'"
)
);

Классификатор = Новый КлассификаторОшибок;
Классификатор.ДобавитьПравила(Правила);

Попытка
ВыполнитьВнешнююОперациюСФайлом();
Исключение
ИсходнаяОшибка = ИнформацияОбОшибке();
// Например: External exception (System.IO.IOException): Файл 'report.json' уже существует.

НормализованнаяОшибка = Классификатор.Классифицировать(ИсходнаяОшибка);
КонецПопытки;
```

Классификатор выделит из исходной ошибки тип `System.IO.IOException` и внутренний текст
`Файл 'report.json' уже существует.`. Правило проверит тип, префикс и окончание текста,
а путь файла между ними останется произвольным. Результатом будет ошибка со стабильным
кодом `filesystem.already_exists`.


Чтобы подключить отдельный набор правил, зарегистрируйте тип поставщика с методом `Все()`:

```bsl
Классификатор.ДобавитьПоставщикаПравил(Тип("ПравилаОшибокШлюза"));
```

Регистрируйте тип поставщика, если ему не нужны параметры конструктора. Передавайте
готовый объект, когда правила зависят от настроек или других объектов. Примеры создания
и подключения наборов правил приведены в
[КлассификаторОшибок](docs/КлассификаторОшибок.md).

### Добавить контекст

Контекст описывает выполнявшуюся операцию, но сохраняет код исходной ошибки:
Expand Down Expand Up @@ -235,6 +286,8 @@ ONESCRIPT_ERRORS_SECTIONS=current,causes,stack
| [`РазборОшибки`](docs/РазборОшибки.md) | Сохранённый разбор цепочки причин |
| [`СнимокКадраОшибки`](docs/СнимокКадраОшибки.md) | Безопасный снимок одного кадра цепочки |
| [`ВыборкаОшибок`](docs/ВыборкаОшибок.md) | Фильтрация и группировка ошибок |
| [`КлассификаторОшибок`](docs/КлассификаторОшибок.md) | Классификация по декларативным правилам |
| [`ПравилоКлассификацииОшибок`](docs/ПравилоКлассификацииОшибок.md) | Описание одного правила |

## Документация и примеры

Expand All @@ -249,18 +302,18 @@ ONESCRIPT_ERRORS_SECTIONS=current,causes,stack

Установите зависимости:

```console
```shell
opm install -l --dev
```

Запустите тесты:

```console
```shell
oneunit execute
```

Соберите пакет:

```console
```shell
opm build .
```
16 changes: 9 additions & 7 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

- [Создание и обёртывание ошибок](БенчмаркСозданияИОбертыванияОшибок.os)
- [Создание с форматированием описания](БенчмаркСозданияОшибокСФорматированием.os)
- [Классификация неструктурированных ошибок](БенчмаркКлассификацииОшибок.os)
- [Масштабирование классификации по числу правил](БенчмаркМасштабированияКлассификацииОшибок.os)
- [Разбор и поиск по цепочке](БенчмаркРазбораИПоискаОшибок.os)
- [Материализация разбора](БенчмаркМатериализацииРазбораОшибки.os)
- [Поиск в материализованной выборке](БенчмаркПоискаВВыборкеОшибок.os)
Expand All @@ -21,24 +23,24 @@

Для запуска установите `BenchmarkOneScript`:

```powershell
```shell
opm install benchmark
```

Запуск всех бенчмарков:

```powershell
benchos run .\benchmarks
```shell
benchos run ./benchmarks
```

Запуск отдельного набора:

```powershell
benchos run .\benchmarks\БенчмаркМатериализацииРазбораОшибки.os
```shell
benchos run ./benchmarks/БенчмаркМатериализацииРазбораОшибки.os
```

Короткий диагностический запуск:

```powershell
benchos run --iterationCount 2 --warmupCount 1 .\benchmarks
```shell
benchos run --iterationCount 2 --warmupCount 1 ./benchmarks
```
Loading
Loading