-
Notifications
You must be signed in to change notification settings - Fork 4
Обработка ошибок
Сейчас в библиотеке есть два места, которые могут выбросить исключения. Если вылетают какие-то другие ошибки, следует зарепортить об этом в 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
, т.е. скорее всего вылетание этого исключения говорит об ошибке в вашей программе. Следовательно, скорее всего, его не нужно обрабатывать.