2016-05-26 2 views
0

В настоящее время я пытаюсь обрабатывать исключения и ошибки в приложении NodeJS, которое будет использоваться для критической информации. Мне нужно чистое управление ошибками! Мне было интересно, есть ли что-то похожее на инкапсуляцию Java Exceptions.Индексация ошибок NodeJS

Я объясняю.

В Java вы можете сделать что-то подобное:

try { 
    // something that throws Exception 
} catch (Throwable t) { 
    throw new Exception("My message", t); 
} 

Это позволяет определить, когда зарегистрируют ваше исключение, и вы получите всю трассировку стеки и вызвать путь!

Я хотел бы знать, есть ли способ сделать то же самое в NodeJS, потому что регистрация на каждом шаге, кажется, не является правильным способом делать что-то.

Спасибо.

ответ

0

Я отвечаю на свой вопрос, чтобы объяснить, что я, наконец, сделал, чтобы получить желаемую инкапсуляцию. Я использовал https://www.npmjs.com/package/verror как предложил Сачакр.

Тогда я протянул его таким образом:

my_error.js:

var VError   = require('verror'); 
var _    = require('lodash'); 

function MyError() { 
    var args = []; 

    var httpErrorCode; 
    var cause; 

    if (arguments.length > 0) { 
     var lastArgumentIndex = [arguments.length]; 

     cause = manageCause(lastArgumentIndex, arguments); 
     httpErrorCode = manageHttpCode(lastArgumentIndex, arguments); 

     for (var i = 0; i < lastArgumentIndex; i++) { 
      args[i] = arguments[i]; 
     } 
    } 

    this.__proto__.__proto__.constructor.apply(this, args); 

    if (cause) { 
     if (this.stack) { 
      this.stack += '\n' + cause.stack; 
     } else { 
      this.stack = cause.stack; 
     } 
    } 

    this.httpErrorCode = httpErrorCode; 
} 

MyError.prototype.__proto__ = VError.prototype; 

function manageCause(lastArgumentIndex, arguments) { 
    if (lastArgumentIndex[0] > 0 
     && arguments[lastArgumentIndex[0] - 1] instanceof Error) { 

     lastArgumentIndex[0]--; 
     return arguments[lastArgumentIndex[0]]; 
    } 
} 

function manageHttpCode(lastArgumentIndex, arguments) { 
    if (lastArgumentIndex[0] > 0 
     && _.isNumber(arguments[lastArgumentIndex[0] - 1])) { 

     lastArgumentIndex[0]--; 
     return arguments[lastArgumentIndex[0]]; 
    } 
} 

module.exports = MyError; 

Это позволяет мне использовать его легко в моем коде:

var MyError = require('./my_error.js'); 

function withErrors() { 
    try { 
     // something with errors 
    } catch (err) { 
     // This is the same pattern as VError 
     return new MyError("My message", err, 401); 
    } 
} 

function somethingToDo(req, res) { 
    var result = withErrors(); 

    if (result instanceof MyError) { 
     logger.warn(result); 
     res.status(result.httpErrorCode).send(result.message).end(); 
     return 
    } 
} 

Таким образом, я зайца хорошая трассировка стека с дорожкой вызова и каждой линией, участвующей в ошибке/исключении.

Надеется, что это поможет людям, потому что я искал looooong времени :)

EDIT: Я изменил мой класс MyError добавить HTTP коды ошибок и управления чистыми аргументов.

0

Вы должны быть в состоянии сделать что-то вроде:

funtion exception(message, error) { 
    this.message = message; 
    this.stacktrace = error.stack; 
} 

try { 
    if(someData == false) 
     throw new exception("something went wrong!", new Error()); 
} 
catch(ex) { 
    console.log(ex.message); 
    console.log(ex.stacktrace); 
} 

Вы можете бросить свой собственный экземпляр пользовательского исключения, содержащий все, что отладочные вам нужно.

EDIT: добавлен стек трассировки объекта исключения

+0

Дело в том, что я не хочу регистрировать его сразу. Я хочу, чтобы моя вызывающая функция получала эту ошибку и управляла ею (может быть, ее можно записать, может быть бросить, ...). Потому что, если я запишу его сейчас, я не имею представления о целом контексте. Поэтому я хочу пропагандировать, не теряя информации. – Bidi

+0

Итак, нет собственного способа правильно обрабатывать распространение ошибок? Должен ли я создавать свою собственную структуру? – Bidi

+0

NodeJS - это всего лишь механизм javascript из хрома с несколькими колокольчиками. Если не существует доступного пакета узлов, в настоящее время я не знаю какого-либо родного способа. – Base33

1

Вы должны смотреть на этот модуль: https://www.npmjs.com/package/verror

Joyent процитировать на его управления ошибками лучших обычаях: https://www.joyent.com/developers/node/design/errors

В Joyent, мы используйте модуль verror для обертывания ошибок, так как это синтаксически сжато. На момент написания этой статьи это еще не все , но это будет расширено для этого.

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

А также скрыть подробности клиенту с завернутой ошибкой: WError(), который возвращает только последнее сообщение об ошибке.

+0

Спасибо, я посмотрю! – Bidi

+0

Это то, что я искал, но почему это не родной?! В любом случае, спасибо! – Bidi

+0

Эта библиотека хороша, но она наполовину закончена. Когда вы инкапсулируете предыдущую ошибку A в ошибку B. Окончательное сообщение верно, но трассировка стека имеет только B: '( – Bidi