Ответ 1
Текущее состояние обработки ошибок в популярных генераторах весьма разнообразно:
-
в большинстве случаев они просто регистрируют ошибку и возвращаются из действия и позволяют выполнять действия подсетей и возвращать код состояния 0:
generator-karma
setupTravis
метод:if (err) { this.log.error('Could not open package.json for reading.', err); done(); return;
}
-
или установите собственное свойство
abort
при ошибке и пропустите дальнейшие действия с помощью cheking в свойствеabort
, но все же верните код состояния 0:generator-jhipster CloudFoundryGenerator:
CloudFoundryGenerator.prototype.checkInstallation = function checkInstallation() { if(this.abort) return; var done = this.async(); exec('cf --version', function (err) { if (err) { this.log.error('cloudfoundry\ cf command line interface is not available. ' + 'You can install it via https://github.com/cloudfoundry/cli/releases'); this.abort = true; } done(); }.bind(this)); };
-
или вручную завершите процесс с помощью
process.exit
:generator-mobile
configuring
метод:if (err) { self.log.error(err); process.exit(1); }
Однако ни один из этих методов не дает хороший сигнал для среды, что что-то пошло не так, за исключением последнего, но прямой вызов process.exit
является дизайнерским запахом.
Выбрасывание исключения также является опцией, но это также представляет стекестрах для пользователя, что не всегда является хорошей идеей.
Лучшим вариантом будет использование метода Environment.error, который имеет ряд приятных преимуществ:
-
Environment
полностью раскрывает свойствоenv
yeoman.generators.Base
- Событие
error
испускается, которое обрабатывается кодом yo cli - выполнение приведет к ненужному (ошибочному) коду состояния, который является переопределяемым
- По умолчанию yo будет отображать только сообщение и нет stacktrace
- при повторном запуске генератора может быть отображена опция stacktrace с предоставлением встроенной опции
--debug
.
Используя эту технику, ваш метод действия будет выглядеть следующим образом:
module.exports = generators.Base.extend({
method1: function () {
console.log('method 1 just ran');
this.env.error("something bad is happened");
console.log('this won't be executed');
},
method2: function () {
console.log('this won't be executed');
}
});