Skip to content

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

Георгий У edited this page Jul 31, 2021 · 19 revisions

Сейчас в библиотеке есть два места, которые могут выбросить исключения. Если вылетают какие-то другие ошибки, следует зарепортить об этом в Issues.

Создание лемм

Функция createLemma выбрасывает LemmaException, что по смыслу аналогично IllegalArgumentException в Java. Оно может быть выброшено и из других мест, если передавать в них обычные объекты вместо уже готовых лемм, т.к. в этом случае createLemma будет вызываться внутри этих методов..

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

try {
    let x = RussianNouns.createLemma(параметры);
    // Какие-то манипуляции с этой леммой.
} catch (e) {
    if (e instanceof RussianNouns.LemmaException) {
        // Восстановление работы.
        // Например, выбор другого синонима для предложения
        // или просто пропуск этой леммы во время, скажем, создания словаря.
        console.error(e.message)
    } else {
        // Это ошибка в библиотеке.
        // Следует зарепортить на GitHub.
        throw e;
    }
}

Начиная с версии 1.2.5 добавлена альтернативная функция createLemmaNoThrow, которая тоже конструирует иммутабельные леммы, но вместо выбрасывания исключений возвращает массив (кортеж?) из двух элементов: nullable-лемма и nullable-сообщение об ошибке, т.е. в Go'шном стиле. Скорее всего это быстрее работает, но причина в другом — сделать библиотеку более удобной для портирования. И чтобы можно было не делать логику через исключения.

Этот метод возвращает null или слева, или справа.

Можно, например, обрабатывать так:

const lemmaErr = RussianNouns.createLemmaNoThrow(параметры);

if (lemmaErr[0]) {
    // Работаем с lemmaErr[0].
} else {
    // Логгируем ошибку lemmaErr[1].
}

Или как в примере на сайте Go:

const lemmaErr = RussianNouns.createLemmaNoThrow(параметры);

// Можно использовать строгое неравенство, т.к. API гарантирует,
// что возвращаться будет именно null, а не undefined.
if (lemmaErr[1] !== null) {
    console.error(lemmaErr[1]);
    process.exit(1);
}

// Работаем с lemmaErr[0].

Должно работать и так, ведь сообщение об ошибке не может быть пустой строкой, а любая строка, кроме пустой, превращается в true:

const lemmaErr = RussianNouns.createLemmaNoThrow(параметры);

if (lemmaErr[1]) {
    console.error(lemmaErr[1]);
} else {
    const lemma = lemmaErr[0];
    // ...
}

Способ обработки ограничен лишь вашей фантазией. Функция createLemmaNoThrow должна всегда выполняться без исключений. Если у вас получилось передать в неё что-то, что приводит к выбрасыванию исключения, пожалуйста, заведите багрепорт.

Добавление ударений в словарь ударений

В данный момент, выбрасывание StressDictionaryException свидетельствует только о том, что вы передаёте строку неправильного формата в StressDictionary.put, т.е. скорее всего вылетание этого исключения говорит об ошибке в вашей программе. Следовательно, скорее всего, его не нужно обрабатывать.