Как выполнить СУХУЮ обработку ошибок в node.js ?

#node.js

#node.js

Вопрос:

Я отметил, что в нескольких node.js примеры, функции начинаются с:

 if (err) { throw err; }
 

Это явно становится довольно повторяющимся с большим количеством функций.

Рассматриваю простой скрипт с глобальным обработчиком исключений. Например, в последовательности операций файловой системы, таких как:

 function workOnFile2(err,data){
    if (err) throw err;
    fs.readFile('file3', ...)   
}

function workOnFile1(err,data){
    if (err) throw err;
    fs.readFile('file2', workOnFile2)
}

function start(){
    fs.readFile('file1', workOnFile1)
}
 

Как следует обрабатывать ошибки, не повторяясь?

Комментарии:

1. Можете ли вы привести пару конкретных примеров, когда вы хотите УДАЛИТЬ это, потому что не все варианты использования этой единственной строки кода могут быть заменены таким же образом, поскольку это действительно зависит от того, кто является вызывающим абонентом и как вы можете заменить вызывающего абонента чем-то, что автоматически вызывает это условие.

2. Конечно, отредактирую, спасибо.

Ответ №1:

Если рассматриваемая строка всегда является первой строкой в функции обратного вызова, то вы можете создать прокладку обратного вызова, которая будет работать за вас:

 function cbShim(fn) {
    return function(err) {
        if (err) { throw err; }
        return fn.apply(this, arguments);
    }
}
 

Затем, вместо того, чтобы передавать ваш обратный вызов другой функции, вы передаете cbShim(yourcallback) , и если первый аргумент, переданный этому обратному вызову, является правдивым, то он выдаст эту ошибку.


Итак, в вашем примере вместо этого:

 function workOnFile2(err,data){
    if (err) throw err;
    fs.readFile('file3', ...)   
}

function workOnFile1(err,data){
    if (err) throw err;
    fs.readFile('file2', workOnFile2)
}

function start(){
    fs.readFile('file1', workOnFile1)
}
 

Вы могли бы просто иметь это:

 function workOnFile2(err,data){
    fs.readFile('file3', ...)   
}

function workOnFile1(err,data){
    fs.readFile('file2', cbShim(workOnFile2));
}

function start(){
    fs.readFile('file1', cbShim(workOnFile1));
}
 

Или вы могли бы даже встроить это в свою собственную версию readFile() , если хотите всегда выбрасывать, если она возвращает ошибку.

 // your own version of readFile that always throws upon error
fs.readFileThrow = function(file, cb) {
    return fs.readFile(file, function(err, data) {
        if (err) throw err;
        return cb(err, data);
    });
}

function workOnFile2(err,data){
    fs.readFileThrow('file3', ...);   
}

function workOnFile1(err,data){
    fs.readFileThrow('file2', workOnFile2);
}

function start(){
    fs.readFileThrow('file1', workOnFile1);
}
 

Комментарии:

1. Почему понижающий голос? Разве это не делает то, что просил OP?

2. Я ненавижу голоса без комментариев… ваше решение кажется мне верным.