sadr0b0t / babbler_h

GNU Lesser General Public License v3.0
7 stars 1 forks source link

Привести в порядок отлов ошибок (отличать одну ошибку от другой) #10

Closed sadr0b0t closed 7 years ago

sadr0b0t commented 7 years ago

Сейчас ошибки из babbler в onResult приходят стандартно в поле err

    babbler.sendCmd("help", ["--list"],
        // onResult
        function(err, reply, cmd, params) {
            if(err) {
                console.log("fail with '" + cmd + " " + params + "': " + err);
            } else {
                console.log("got reply on '" + cmd + " " + params + "': " + reply);
            }
        }
    );

сообщения для возможных ошибок перечислены в константах https://github.com/1i7/babbler-js/blob/master/src/babbler.js#L70

/** Ошибка команды: таймаут */
const BBLR_ERROR_REPLY_TIMEOUT = "Reply timeout";
/** Ошибка команды: устройство отключено до отпавки */
const BBLR_ERROR_DISCONNECTED_BEFORE = "Device disconnected before cmd was sent";
/** Ошибка команды: устройство отключено после отпавки */
const BBLR_ERROR_DISCONNECTED_AFTER = "Device disconnected after cmd was sent";
/** Ошибка команды: устройство не подключено */
const BBLR_ERROR_NOT_CONNECTED = "Device not connected"
/** Ошибка команды: ошибка записи в порт */
const BBLR_ERROR_WRITING_TO_PORT = "Error writing to port"
/** Неправильное имя порта устройства */
const BBLR_ERROR_INVALID_PORT_NAME = "Invalid port name"

однако, по текстовым сообщения определять, что это именно за ошибка, как-то не технологично.

Как выяснилось, так считаю не я один. В самом JavaScript этому моменту не уделено достаточно внимания, поэтому придумывают специальные техники: добавляют имя и код ошибки.

Тонкости nodejs. Часть II: Работа c ошибками https://habrahabr.ru/post/244523/

sadr0b0t commented 7 years ago

Блин, ну и фигня

здесь Тонкости nodejs. Часть II: Работа c ошибками https://habrahabr.ru/post/244523/

рекомендуют работать с полями message, name и code. Есть рекомендации по значениям, но не дают примера, как их лучше устанавливать.

оттуда же ссылка на спеки, вот глава про Error

15.11 Error Objects http://www.ecma-international.org/ecma-262/5.1/#sec-15.11

там есть name и message

15.11.4.2 Error.prototype.name The initial value of Error.prototype.name is "Error". 15.11.4.3 Error.prototype.message The initial value of Error.prototype.message is the empty String.

В Node ничего про поле name нет Node.js v7.4.0 Documentation: Errors https://nodejs.org/api/errors.html

зато есть поле code у SystemError https://nodejs.org/api/errors.html#errors_error_code

очевидно, пользовательское, не общее для всех вообще ошибок Error

здесь пишут про поля name и message http://javascript.ru/error

еще неплохая обзорная статья Обработка ошибок в Node.js https://habrahabr.ru/post/222761/

Ошибка обязательно должна содержать корректные поля: name: используется обработчиками для дифференциации ошибок по типу. message: текст описывающий возникшую проблему. Текст должен быть коротким, но достаточно ёмким, что бы можно было понять суть проблемы. stack: никогда не изменяйте объект стэка вызовов. V8 производит построение этого объекта только тогда, когда к нему производится обращение и процесс построения достаточно ресурсоёмкий, обращение к этому полю существенно снижает производительность программы.

И лучшая статья - документация у Мозилы https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Error

есть общие рекомендации и пример.

Пример: пользовательские типы ошибок Вы можете захотеть определить свои собственные типы ошибок, унаследованные от Error, что бы иметь возможноть писать throw new MyError() и использовать instanceof MyError для проверки вида ошибки в обработчике исключений. Ниже продемонстрирован общий подход к выполнению этой задачи.

// Создаём новый объект, затем через прототип делаем его наследником конструктора Error.
function MyError(message) {
  this.name = 'MyError';
  this.message = message || 'Сообщение по умолчанию';
  this.stack = (new Error()).stack;
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;

try {
  throw new MyError();
} catch (e) {
  console.log(e.name);     // 'MyError'
  console.log(e.message);  // 'Сообщение по умолчанию'
}

try {
  throw new MyError('пользовательское сообщение');
} catch (e) {
  console.log(e.name);     // 'MyError'
  console.log(e.message);  // 'пользовательское сообщение'
}
sadr0b0t commented 7 years ago

блин, не тот проект https://github.com/1i7/babbler-js/issues/5